@elite-dangerous-almanac/core 0.1.5 → 0.1.7

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 (204) hide show
  1. package/PROVENANCE/i18n/SOURCES.md +107 -51
  2. package/PROVENANCE/ships/SOURCES.md +43 -2
  3. package/README.md +11 -5
  4. package/THIRD_PARTY_NOTICES.md +3 -0
  5. package/assets/ships/Adder/gunsight.svg +17 -0
  6. package/assets/ships/Anaconda/gunsight.svg +32 -0
  7. package/assets/ships/Asp/gunsight.svg +26 -0
  8. package/assets/ships/Asp_Scout/gunsight.svg +20 -0
  9. package/assets/ships/BelugaLiner/gunsight.svg +23 -0
  10. package/assets/ships/CobraMkIII/gunsight.svg +20 -0
  11. package/assets/ships/CobraMkIV/gunsight.svg +23 -0
  12. package/assets/ships/CobraMkV/gunsight.svg +23 -0
  13. package/assets/ships/Corsair/gunsight.svg +26 -0
  14. package/assets/ships/Cutter/gunsight.svg +29 -0
  15. package/assets/ships/DiamondBack/gunsight.svg +20 -0
  16. package/assets/ships/DiamondBackXL/gunsight.svg +17 -0
  17. package/assets/ships/Dolphin/gunsight.svg +14 -0
  18. package/assets/ships/Eagle/gunsight.svg +17 -0
  19. package/assets/ships/Empire_Courier/gunsight.svg +17 -0
  20. package/assets/ships/Empire_Eagle/gunsight.svg +17 -0
  21. package/assets/ships/Empire_Trader/gunsight.svg +20 -0
  22. package/assets/ships/Explorer_NX/gunsight.svg +29 -0
  23. package/assets/ships/Federation_Corvette/gunsight.svg +29 -0
  24. package/assets/ships/Federation_Corvette/schematic-bottom.svg +5 -5
  25. package/assets/ships/Federation_Corvette/schematic-top.svg +14 -14
  26. package/assets/ships/Federation_Dropship/gunsight.svg +23 -0
  27. package/assets/ships/Federation_Dropship_MkII/gunsight.svg +20 -0
  28. package/assets/ships/Federation_Gunship/gunsight.svg +29 -0
  29. package/assets/ships/FerDeLance/gunsight.svg +23 -0
  30. package/assets/ships/Hauler/gunsight.svg +11 -0
  31. package/assets/ships/Independant_Trader/gunsight.svg +20 -0
  32. package/assets/ships/Krait_Light/gunsight.svg +20 -0
  33. package/assets/ships/Krait_MkII/gunsight.svg +23 -0
  34. package/assets/ships/LakonMiner/gunsight.svg +32 -0
  35. package/assets/ships/Mamba/gunsight.svg +23 -0
  36. package/assets/ships/Mandalay/gunsight.svg +26 -0
  37. package/assets/ships/MediumTransport01/gunsight.svg +23 -0
  38. package/assets/ships/Orca/gunsight.svg +17 -0
  39. package/assets/ships/PantherMkII/gunsight.svg +38 -0
  40. package/assets/ships/Python/gunsight.svg +23 -0
  41. package/assets/ships/Python_NX/gunsight.svg +26 -0
  42. package/assets/ships/SideWinder/gunsight.svg +14 -0
  43. package/assets/ships/SmallCombat01_NX/gunsight.svg +23 -0
  44. package/assets/ships/Type6/gunsight.svg +14 -0
  45. package/assets/ships/Type7/gunsight.svg +20 -0
  46. package/assets/ships/Type8/gunsight.svg +26 -0
  47. package/assets/ships/Type9/gunsight.svg +23 -0
  48. package/assets/ships/Type9_Military/gunsight.svg +35 -0
  49. package/assets/ships/TypeX/gunsight.svg +26 -0
  50. package/assets/ships/TypeX_2/gunsight.svg +26 -0
  51. package/assets/ships/TypeX_3/gunsight.svg +29 -0
  52. package/assets/ships/Viper/gunsight.svg +20 -0
  53. package/assets/ships/Viper_MkIV/gunsight.svg +20 -0
  54. package/assets/ships/Vulture/gunsight.svg +14 -0
  55. package/dist/chunk-2VPVZELZ.js +1 -0
  56. package/dist/{chunk-MTAGULIO.js.map → chunk-2VPVZELZ.js.map} +1 -1
  57. package/dist/{chunk-6RLMBSXE.js → chunk-4S6WB7QR.js} +1 -1
  58. package/dist/chunk-4TFAZX73.js +1 -0
  59. package/dist/{chunk-EJMNNQIS.js.map → chunk-4TFAZX73.js.map} +1 -1
  60. package/dist/chunk-4ZGUSHTP.js +1 -0
  61. package/dist/{chunk-CTJQPQRA.js.map → chunk-4ZGUSHTP.js.map} +1 -1
  62. package/dist/{chunk-XT6KKGSE.js → chunk-6G6TYW2D.js} +1 -1
  63. package/dist/chunk-AFS6HN3D.js +1 -0
  64. package/dist/chunk-AFS6HN3D.js.map +1 -0
  65. package/dist/{chunk-XN6Q7LWU.js → chunk-CJWFY6OX.js} +1 -1
  66. package/dist/{chunk-UBYO7VZR.js → chunk-DBGXZF7O.js} +1 -1
  67. package/dist/{chunk-H3HMVGEY.js → chunk-EKQCVCMK.js} +1 -1
  68. package/dist/chunk-ELT3FEA4.js +1 -0
  69. package/dist/{chunk-3IMWUYXJ.js.map → chunk-ELT3FEA4.js.map} +1 -1
  70. package/dist/chunk-EXVCRIDP.js +1 -0
  71. package/dist/chunk-EXVCRIDP.js.map +1 -0
  72. package/dist/{chunk-EKWLAHRG.js → chunk-GRSNX36B.js} +1 -1
  73. package/dist/{chunk-EKWLAHRG.js.map → chunk-GRSNX36B.js.map} +1 -1
  74. package/dist/chunk-GVNTKCVF.js +1 -0
  75. package/dist/chunk-GVNTKCVF.js.map +1 -0
  76. package/dist/{chunk-FEER4ERG.js → chunk-IOJXLDJN.js} +1 -1
  77. package/dist/chunk-J42ZXLBL.js +1 -0
  78. package/dist/{chunk-GKDEI2SQ.js.map → chunk-J42ZXLBL.js.map} +1 -1
  79. package/dist/{chunk-PHPLZEFS.js → chunk-JPBMRJFC.js} +1 -1
  80. package/dist/{chunk-PHPLZEFS.js.map → chunk-JPBMRJFC.js.map} +1 -1
  81. package/dist/chunk-KJFUNIIY.js +1 -0
  82. package/dist/{chunk-TFPIPIMU.js.map → chunk-KJFUNIIY.js.map} +1 -1
  83. package/dist/{chunk-QMFBL5XO.js → chunk-LLHGSBPI.js} +1 -1
  84. package/dist/{chunk-QMFBL5XO.js.map → chunk-LLHGSBPI.js.map} +1 -1
  85. package/dist/{chunk-FGNJ7EVM.js → chunk-LZYHBFJC.js} +1 -1
  86. package/dist/{chunk-FGNJ7EVM.js.map → chunk-LZYHBFJC.js.map} +1 -1
  87. package/dist/chunk-M6G3UDTX.js +1 -0
  88. package/dist/chunk-M6G3UDTX.js.map +1 -0
  89. package/dist/{chunk-DLLBARN5.js → chunk-MKGJPVPS.js} +1 -1
  90. package/dist/{chunk-QI22FKBG.js → chunk-Q3QCLNVG.js} +1 -1
  91. package/dist/{chunk-QI22FKBG.js.map → chunk-Q3QCLNVG.js.map} +1 -1
  92. package/dist/chunk-RVIYOHYF.js +1 -0
  93. package/dist/chunk-RVIYOHYF.js.map +1 -0
  94. package/dist/chunk-SD6GNFDX.js +1 -0
  95. package/dist/chunk-SD6GNFDX.js.map +1 -0
  96. package/dist/chunk-SNADUQSJ.js +1 -0
  97. package/dist/chunk-SNADUQSJ.js.map +1 -0
  98. package/dist/chunk-TEOJCBSG.js +1 -0
  99. package/dist/chunk-TEOJCBSG.js.map +1 -0
  100. package/dist/chunk-TW7LUBHD.js +1 -0
  101. package/dist/{chunk-HRVIHQ4A.js.map → chunk-TW7LUBHD.js.map} +1 -1
  102. package/dist/{chunk-O72KI7RP.js → chunk-UHSNB5SV.js} +1 -1
  103. package/dist/chunk-V4C6FIE2.js +1 -0
  104. package/dist/{chunk-TLA6LHLN.js.map → chunk-V4C6FIE2.js.map} +1 -1
  105. package/dist/chunk-VDVFJXX5.js +1 -0
  106. package/dist/{chunk-PNZCLQDJ.js.map → chunk-VDVFJXX5.js.map} +1 -1
  107. package/dist/chunk-Z6XMXMVI.js +1 -0
  108. package/dist/{chunk-2J2UV4ZX.js.map → chunk-Z6XMXMVI.js.map} +1 -1
  109. package/dist/{chunk-VB3XZGIB.js → chunk-ZRG35JSH.js} +1 -1
  110. package/dist/{chunk-77QR33ON.js → chunk-ZZT2PQZ5.js} +1 -1
  111. package/dist/i18n/blueprints.d.ts +2 -1
  112. package/dist/i18n/blueprints.js +1 -1
  113. package/dist/i18n/diagnostics.d.ts +2 -0
  114. package/dist/i18n/diagnostics.js +1 -1
  115. package/dist/i18n/engineering-groups.d.ts +2 -2
  116. package/dist/i18n/engineering-groups.js +1 -1
  117. package/dist/i18n/experimental-effect-descriptions.js +1 -1
  118. package/dist/i18n/experimental-effects.js +1 -1
  119. package/dist/i18n/index.d.ts +32 -1
  120. package/dist/i18n/index.js +1 -1
  121. package/dist/i18n/materials.d.ts +2 -3
  122. package/dist/i18n/materials.js +1 -1
  123. package/dist/i18n/micro-resources.d.ts +2 -3
  124. package/dist/i18n/micro-resources.js +1 -1
  125. package/dist/i18n/module-families.d.ts +32 -0
  126. package/dist/i18n/module-families.js +1 -0
  127. package/dist/i18n/module-families.js.map +1 -0
  128. package/dist/i18n/modules.d.ts +3 -4
  129. package/dist/i18n/modules.js +1 -1
  130. package/dist/i18n/pre-engineered.js +1 -1
  131. package/dist/i18n/ships.js +1 -1
  132. package/dist/i18n/slots.js +1 -1
  133. package/dist/materials/index.js +1 -1
  134. package/dist/materials/materials-all.js +1 -1
  135. package/dist/materials/materials.js +1 -1
  136. package/dist/materials/micro-resources-all.js +1 -1
  137. package/dist/materials/micro-resources.js +1 -1
  138. package/dist/ships/blueprint-costs.d.ts +3 -1
  139. package/dist/ships/blueprint-costs.js +1 -1
  140. package/dist/ships/blueprint-costs.js.map +1 -1
  141. package/dist/ships/blueprints.d.ts +4 -1
  142. package/dist/ships/blueprints.js +1 -1
  143. package/dist/ships/engineering.d.ts +1 -0
  144. package/dist/ships/experimental-effect-costs.d.ts +3 -2
  145. package/dist/ships/experimental-effect-costs.js +1 -1
  146. package/dist/ships/experimental-effect-costs.js.map +1 -1
  147. package/dist/ships/experimental-effects.d.ts +3 -1
  148. package/dist/ships/experimental-effects.js +1 -1
  149. package/dist/ships/gunsights.js +1 -1
  150. package/dist/ships/index.d.ts +7 -5
  151. package/dist/ships/index.js +1 -1
  152. package/dist/ships/loadout-validation.d.ts +1 -0
  153. package/dist/ships/module-capabilities.d.ts +1 -0
  154. package/dist/ships/module-families.d.ts +49 -0
  155. package/dist/ships/module-families.js +1 -0
  156. package/dist/ships/module-families.js.map +1 -0
  157. package/dist/ships/module-limits.d.ts +1 -0
  158. package/dist/ships/modules-all.d.ts +1 -0
  159. package/dist/ships/modules-all.js +1 -1
  160. package/dist/ships/modules-core.d.ts +1 -0
  161. package/dist/ships/modules-core.js +1 -1
  162. package/dist/ships/modules-hardpoint.d.ts +2 -0
  163. package/dist/ships/modules-hardpoint.js +1 -1
  164. package/dist/ships/modules-internal.d.ts +2 -0
  165. package/dist/ships/modules-internal.js +1 -1
  166. package/dist/ships/modules-utility.d.ts +2 -0
  167. package/dist/ships/modules-utility.js +1 -1
  168. package/dist/ships/modules.d.ts +23 -5
  169. package/dist/ships/modules.js +1 -1
  170. package/dist/ships/pre-engineered-stats.d.ts +1 -0
  171. package/dist/ships/pre-engineered-stats.js +1 -1
  172. package/dist/ships/pre-engineered.js +1 -1
  173. package/dist/ships/ship-loadout.d.ts +73 -32
  174. package/dist/ships/ship-loadout.js +1 -1
  175. package/dist/ships/weapons.d.ts +1 -0
  176. package/package.json +9 -1
  177. package/dist/chunk-2J2UV4ZX.js +0 -1
  178. package/dist/chunk-3IMWUYXJ.js +0 -1
  179. package/dist/chunk-CTJQPQRA.js +0 -1
  180. package/dist/chunk-DAQ3PJ4R.js +0 -1
  181. package/dist/chunk-DAQ3PJ4R.js.map +0 -1
  182. package/dist/chunk-E45EDCYH.js +0 -1
  183. package/dist/chunk-E45EDCYH.js.map +0 -1
  184. package/dist/chunk-EJMNNQIS.js +0 -1
  185. package/dist/chunk-GKDEI2SQ.js +0 -1
  186. package/dist/chunk-HRVIHQ4A.js +0 -1
  187. package/dist/chunk-M5IBENCW.js +0 -1
  188. package/dist/chunk-M5IBENCW.js.map +0 -1
  189. package/dist/chunk-MTAGULIO.js +0 -1
  190. package/dist/chunk-PNZCLQDJ.js +0 -1
  191. package/dist/chunk-TFPIPIMU.js +0 -1
  192. package/dist/chunk-TLA6LHLN.js +0 -1
  193. package/dist/chunk-XULHGGG4.js +0 -1
  194. package/dist/chunk-XULHGGG4.js.map +0 -1
  195. /package/dist/{chunk-6RLMBSXE.js.map → chunk-4S6WB7QR.js.map} +0 -0
  196. /package/dist/{chunk-XT6KKGSE.js.map → chunk-6G6TYW2D.js.map} +0 -0
  197. /package/dist/{chunk-XN6Q7LWU.js.map → chunk-CJWFY6OX.js.map} +0 -0
  198. /package/dist/{chunk-UBYO7VZR.js.map → chunk-DBGXZF7O.js.map} +0 -0
  199. /package/dist/{chunk-H3HMVGEY.js.map → chunk-EKQCVCMK.js.map} +0 -0
  200. /package/dist/{chunk-FEER4ERG.js.map → chunk-IOJXLDJN.js.map} +0 -0
  201. /package/dist/{chunk-DLLBARN5.js.map → chunk-MKGJPVPS.js.map} +0 -0
  202. /package/dist/{chunk-O72KI7RP.js.map → chunk-UHSNB5SV.js.map} +0 -0
  203. /package/dist/{chunk-VB3XZGIB.js.map → chunk-ZRG35JSH.js.map} +0 -0
  204. /package/dist/{chunk-77QR33ON.js.map → chunk-ZZT2PQZ5.js.map} +0 -0
@@ -1 +0,0 @@
1
- import{getLocalizedName,createLocalizedNameIndex}from"./chunk-M5IBENCW.js";var material_names_default={Carbon:{en:"Carbon",de:"Kohlenstoff",es:"Carbono",fr:"Carbone",pt:"Carbono",ru:"Углерод",ka:"ნახშირბადი"},Vanadium:{en:"Vanadium",es:"Vanadio",fr:"Vanadium",pt:"Vanádio",ru:"Ванадий",ka:"Vanadium"},Niobium:{en:"Niobium",es:"Niobio",fr:"Niobium",pt:"Nióbio",ru:"Ниобий",ka:"Niobium"},Yttrium:{en:"Yttrium",es:"Ytrio",fr:"Yttrium",pt:"Ítrio",ru:"Иттрий",ka:"Yttrium"},Iron:{en:"Iron",de:"Eisen",es:"Hierro",fr:"Fer",pt:"Ferro",ru:"Железо",ka:"რკინა"},Zinc:{en:"Zinc",de:"Zink",es:"Zinc",fr:"Zinc",pt:"Zinco",ru:"Цинк",ka:"თუთია"},Tin:{en:"Tin",de:"Zinn",es:"Estaño",fr:"Étain",pt:"Estanho",ru:"Олово",ka:"კალა"},Selenium:{en:"Selenium",de:"Selen",es:"Selenio",fr:"Sélénium",pt:"Selênio",ru:"Селен",ka:"სელენი"},Lead:{en:"Lead",de:"Blei",es:"Plomo",fr:"Plomb",pt:"Chumbo",ru:"Свинец",ka:"ტყვია"},Zirconium:{en:"Zirconium",es:"Circonio",fr:"Zirconium",pt:"Zircônio",ru:"Цирконий",ka:"Zirconium"},Boron:{en:"Boron",de:"Bor",es:"Boro",fr:"Bore",pt:"Boro",ru:"Бор",ka:"ბორი"},Antimony:{en:"Antimony",de:"Antimon",es:"Antimonio",fr:"Antimoine",pt:"Antimônio",ru:"Сурьма",ka:"Antimony"},Nickel:{en:"Nickel",es:"Níquel",fr:"Nickel",pt:"Níquel",ru:"Никель",ka:"Nickel"},Germanium:{en:"Germanium",es:"Germanio",fr:"Germanium",pt:"Germânio",ru:"Германий",ka:"Germanium"},Tungsten:{en:"Tungsten",de:"Wolfram",es:"Tungsteno",fr:"Tungstène",pt:"Tungstênio",ru:"Вольфрам",ka:"ვოლფრამი"},Tellurium:{en:"Tellurium",de:"Tellur",es:"Teluro",fr:"Tellure",pt:"Telúrio",ru:"Теллур",ka:"Tellurium"},Phosphorus:{en:"Phosphorus",de:"Phosphor",es:"Fósforo",fr:"Phosphore",pt:"Fósforo",ru:"Фосфор",ka:"ფოსფორი"},Chromium:{en:"Chromium",de:"Chrom",es:"Cromo",fr:"Chrome",pt:"Cromo",ru:"Хром",ka:"ქრომი"},Molybdenum:{en:"Molybdenum",de:"Molibdän",es:"Molibdeno",fr:"Molybdène",pt:"Molibdênio",ru:"Молибден",ka:"Molybdenum"},Technetium:{en:"Technetium",es:"Tecnecio",fr:"Technétium",pt:"Tecnécio",ru:"Технеций",ka:"Technetium"},Rhenium:{en:"Rhenium",es:"Renio",fr:"Rhénium",pt:"Rênio",ru:"Рений",ka:"Rhenium"},Arsenic:{en:"Arsenic",de:"Arsen",es:"Arsénico",fr:"Arsenic",pt:"Arsênico",ru:"Мышьяк",ka:"დარიშხანი"},Mercury:{en:"Mercury",de:"Quecksilber",es:"Mercurio",fr:"Mercure",pt:"Mercúrio",ru:"Ртуть",ka:"Mercury"},Polonium:{en:"Polonium",es:"Polonio",fr:"Polonium",pt:"Polônio",ru:"Полоний",ka:"Polonium"},Sulphur:{en:"Sulphur",de:"Schwefel",es:"Azufre",fr:"Soufre",pt:"Enxofre",ru:"Сера",ka:"გოგირდი"},Manganese:{en:"Manganese",de:"Mangan",es:"Manganeso",fr:"Manganèse",pt:"Manganês",ru:"Марганец",ka:"მანგანუმი"},Cadmium:{en:"Cadmium",de:"Kadmium",es:"Cadmio",fr:"Cadmium",pt:"Cádmio",ru:"Кадмий",ka:"კადმიუმი"},Ruthenium:{en:"Ruthenium",es:"Rutenio",fr:"Ruthénium",pt:"Rutênio",ru:"Рутений",ka:"Ruthenium"},SalvagedAlloys:{en:"Salvaged Alloys",de:"Geborgene Legierungen",es:"Aleaciones recuperadas",fr:"Alliages récupérés",pt:"Ligas recuperadas",ru:"Захваченные сплавы"},GalvanisingAlloys:{en:"Galvanising Alloys",de:"Galvanisierende Legierungen",es:"Aleaciones galvanizadas",fr:"Alliages galvaniques",pt:"Ligas galvanizadas",ru:"Сплавы для гальванизации"},PhaseAlloys:{en:"Phase Alloys",de:"Phasenlegierungen",es:"Aleaciones de fase",fr:"Alliages de phase",pt:"Ligas de fase",ru:"Фазовые сплавы"},ProtoLightAlloys:{en:"Proto Light Alloys",de:"Leichte Legierungen (Proto)",es:"Protoaleaciones ligeras",fr:"Proto-alliages légers",pt:"Proto ligas leves",ru:"Опытные легкие сплавы"},ProtoRadiolicAlloys:{en:"Proto Radiolic Alloys",de:"Radiologische Legierungen (Proto)",es:"Aleaciones protorradiadas",fr:"Proto-alliages radiologiques",pt:"Proto ligas radiólicas",ru:"Сплавы для изготовления зондов"},GridResistors:{en:"Grid Resistors",de:"Gitterwiderstände",es:"Red resistiva",fr:"Résistance à grille",pt:"Resistores de grade",ru:"Наборные резисторы"},HybridCapacitors:{en:"Hybrid Capacitors",de:"Hybridkondensatoren",es:"Capacitadores híbridos",fr:"Condensateurs hybrides",pt:"Capacitores híbridos",ru:"Гибридные конденсаторы"},ElectrochemicalArrays:{en:"Electrochemical Arrays",de:"Elektrochemische Detektoren",es:"Matriz electroquímica",fr:"Réseaux électrochimiques",pt:"Matrizes eletroquímicas",ru:"Электрохимические массивы"},PolymerCapacitors:{en:"Polymer Capacitors",de:"Polymerkondensatoren",es:"Capacitadores de polímeros",fr:"Condensateurs en polymères",pt:"Capacitores de polímeros",ru:"Полимерные конденсаторы"},MilitarySupercapacitors:{en:"Military Supercapacitors",de:"Militärische Superkondensatoren",es:"Supercapacitadores militares",fr:"Supercondensateurs militaires",pt:"Supercapacitores militares",ru:"Военные суперконденсаторы"},ChemicalStorageUnits:{en:"Chemical Storage Units",de:"Lagerungseinheiten für Chemiestoffe",es:"Unidades de almacenamiento químico",fr:"Unités de stockage chimique",pt:"Unidades de armazenamento químico",ru:"Контейнеры для химикатов"},ChemicalProcessors:{en:"Chemical Processors",de:"Chemische Prozessoren",es:"Procesadores químicos",fr:"Processeurs chimiques",pt:"Processadores químicos",ru:"Оборудование для химобработки"},ChemicalDistillery:{en:"Chemical Distillery",de:"Chemiedestillerie",es:"Destilería química",fr:"Distillerie chimique",pt:"Destilaria química",ru:"Оборудование для перегонки химикатов"},ChemicalManipulators:{en:"Chemical Manipulators",de:"Chemische Manipulatoren",es:"Manipuladores químicos",fr:"Manipulateurs chimiques",pt:"Manipuladores químicos",ru:"Манипуляторы для работы с химикатами"},PharmaceuticalIsolators:{en:"Pharmaceutical Isolators",de:"Pharmazeutische Isolatoren",es:"Aislantes farmacéuticos",fr:"Isolants pharmaceutiques",pt:"Isolantes farmacêuticos",ru:"Фармацевтические изоляционные материалы"},CompactComposites:{en:"Compact Composites",de:"Kompaktkomposite",es:"Compuestos compactos",fr:"Composites compacts",pt:"Compostos compactos",ru:"Спрессованные композиты"},FilamentComposites:{en:"Filament Composites",de:"Filament-Komposite",es:"Compuestos de filamentos",fr:"Composites filamentaires",pt:"Compostos filamentares",ru:"Волокнистые композиты"},HighDensityComposites:{en:"High Density Composites",de:"Komposite hoher Dichte",es:"Compuestos de alta densidad",fr:"Composites à haute densité",pt:"Compostos de alta densidade",ru:"Высокоплотностные композиты"},FedProprietaryComposites:{en:"Proprietary Composites",de:"Kompositwerkstoffe",es:"Compuestos con patente",fr:"Composites brevetés",pt:"Compostos proprietários",ru:"Патентованные композиты"},FedCoreComposites:{en:"Core Dynamics Composites",de:"Core Dynamics Kompositwerkstoffe",es:"Compuestos de Core Dynamics",fr:"Composites Core Dynamics",pt:"Compostos da Core Dynamics",ru:"Композиты Core Dynamics"},BasicConductors:{en:"Basic Conductors",de:"Einfache Leiter",es:"Conductores básicos",fr:"Conducteurs simples",pt:"Condutores básicos",ru:"Простые проводники"},ConductiveComponents:{en:"Conductive Components",de:"Leitfähige Komponenten",es:"Componentes conductivos",fr:"Composants conducteurs",pt:"Componentes condutores",ru:"Проводящие компоненты"},ConductiveCeramics:{en:"Conductive Ceramics",de:"Elektrokeramiken",es:"Cerámicas conductivas",fr:"Conducteurs en céramique",pt:"Cerâmicas condutoras",ru:"Проводящая керамика"},ConductivePolymers:{en:"Conductive Polymers",de:"Leitfähige Polymere",es:"Polímeros conductivos",fr:"Conducteurs en polymères",pt:"Polímeros condutores",ru:"Проводящие полимеры"},BiotechConductors:{en:"Biotech Conductors",de:"Biotech-Leiter",es:"Conductores biotecnológicos",fr:"Conducteurs biotechniques",pt:"Condutores biotecnológicos",ru:"Биотехнические проводники"},CrystalShards:{en:"Crystal Shards",de:"Kristallscherben",es:"Piedras de cristal",fr:"Éclats de cristal",pt:"Fragmentos de cristais",ru:"Осколки кристаллов"},UncutFocusCrystals:{en:"Flawed Focus Crystals",de:"Fehlerhafte Fokuskristalle",es:"Cristales de convergencia imperfectos",fr:"Cristaux de focalisation imparfaits",pt:"Cristais de focalização falhos",ru:"Поврежденные фокусировочные кристаллы"},FocusCrystals:{en:"Focus Crystals",de:"Laserkristalle",es:"Cristales de enfoque",fr:"Cristaux de focalisation",pt:"Cristais de focalização",ru:"Фокусировочные кристаллы"},RefinedFocusCrystals:{en:"Refined Focus Crystals",de:"Raffinierte Laserkristalle",es:"Cristales de enfoque refinados",fr:"Cristaux de focalisation raffinés",pt:"Cristais de focalização refinado",ru:"Обработанные фокусировочные кристаллы"},ExquisiteFocusCrystals:{en:"Exquisite Focus Crystals",de:"Erlesene Laserkristalle",es:"Cristales de enfoque exquisitos",fr:"Cristaux de focalisation sans défaut",pt:"Cristais de focalização fino",ru:"Отборные фокусировочные кристаллы"},Guardian_PowerCell:{en:"Guardian Power Cell",de:"Guardian-Energiezelle",es:"Célula de energía de guardián",fr:"Cellule d’énergie - Guardians",pt:"Bateria Guardian",ru:"Энергоячейка Стражей"},Guardian_Sentinel_WreckageComponents:{en:"Guardian Sentinel Wreckage Components",de:"Guardian-Wache-Wrackteilkomponenten",es:"Restos de accidentes de centinela guardián",fr:"Débris de sentinelle - Guardians",pt:"Componentes de destroços Sentinela Guardian",ru:"Обломки кораблекрушения Стражей"},Guardian_PowerConduit:{en:"Guardian Power Conduit",de:"Guardian-Energieleiter",es:"Conducto de energía de guardián",fr:"Conduit d’énergie - Guardians",pt:"Condutores de potência Guardian",ru:"Энергопроводники Стражей"},Guardian_Sentinel_WeaponParts:{en:"Guardian Sentinel Weapon Parts",de:"Guardian-Wache-Waffenteile",es:"Piezas de armamento de centinela guardián",fr:"Pièce d’armement de sentinelle - Guardians",pt:"Peças de armas Sentinela Guardian",ru:"Детали вооружения часовых Стражей"},Guardian_TechComponent:{en:"Guardian Technology Component",de:"Guardian-Technologiekomponenten",es:"Componente tecnológico de guardián",fr:"Composant technologique - Guardians",pt:"Componente de tecnologia Guardian",ru:"Компоненты технологий Стражей"},HeatConductionWiring:{en:"Heat Conduction Wiring",de:"Wärmeleitungsverdrahtung",es:"Cableado de conducción calorífica",fr:"Câblage de conduction thermique",pt:"Fiação de condução térmica",ru:"Теплопроводящие провода"},HeatDispersionPlate:{en:"Heat Dispersion Plate",de:"Wärmeverteilungsplatte",es:"Placa de dispersión de calor",fr:"Plaque de dissipation thermique",pt:"Placa de dispersão térmica",ru:"Теплорассеивающая пластина"},HeatExchangers:{en:"Heat Exchangers",de:"Wärmeaustauscher",es:"Intercambiadores de calor",fr:"Échangeurs de chaleur",pt:"Trocadores térmicos",ru:"Теплообменные агрегаты"},HeatVanes:{en:"Heat Vanes",de:"Wärmeleitbleche",es:"Palas térmicas",fr:"Vannes thermiques",pt:"Ventoinha térmica",ru:"Тепловые заслонки"},ProtoHeatRadiators:{en:"Proto Heat Radiators",de:"Proto-Wärmestrahler",es:"Protorradiadores térmicos",fr:"Proto-radiateurs",pt:"Proto radiadores térmicos",ru:"Прототипы теплоизлучателей"},MechanicalScrap:{en:"Mechanical Scrap",de:"Mechanischer Schrott",es:"Chatarra mecánica",fr:"Ferraille mécanique",pt:"Sucata mecânica",ru:"Механические отходы"},MechanicalEquipment:{en:"Mechanical Equipment",de:"Mechanisches Equipment",es:"Equipamiento mecánico",fr:"Équipement mécanique",pt:"Equipamento mecânico",ru:"Механическое оборудование"},MechanicalComponents:{en:"Mechanical Components",de:"Mechanische Komponenten",es:"Componentes mecánicos",fr:"Composants mécaniques",pt:"Componentes mecânicos",ru:"Механические компоненты"},ConfigurableComponents:{en:"Configurable Components",de:"Konfigurierbare Komponenten",es:"Componentes configurables",fr:"Composants paramétrables",pt:"Componentes configuráveis",ru:"Настраиваемые компоненты"},ImprovisedComponents:{en:"Improvised Components",de:"Behelfskomponenten",es:"Componentes improvisados",fr:"Composants improvisés",pt:"Componentes improvisados",ru:"Кустарные компоненты"},WornShieldEmitters:{en:"Worn Shield Emitters",de:"Gebrauchte Schildemitter",es:"Emisor de escudos desgastado",fr:"Émetteurs de bouclier usés",pt:"Emissores de escudo usado",ru:"Изношенные щитоизлучатели"},ShieldEmitters:{en:"Shield Emitters",de:"Schildemitter",es:"Emisor de escudos",fr:"Émetteurs de bouclier",pt:"Emissores de escudo",ru:"Щитоизлучатели"},ShieldingSensors:{en:"Shielding Sensors",de:"Schildsensoren",es:"Sensores de escudo",fr:"Capteurs de bouclier",pt:"Sensores para proteção",ru:"Сенсоры системы экранирования"},CompoundShielding:{en:"Compound Shielding",de:"Verbundschilde",es:"Escudos compuestos",fr:"Protection composite",pt:"Proteção composta",ru:"Многоступенчатая защита"},ImperialShielding:{en:"Imperial Shielding",de:"Imperiale Schilde",es:"Escudos imperiales",fr:"Protection impériale",pt:"Proteção imperial",ru:"Имперская защита"},tg_abrasion03:{en:"Hardened Surface Fragments",es:"Fragmentos de superficie endurecida",fr:"Fragments superficiels durcis",pt:"Fragmentos de superfície endurecida",ru:"Окаменелые фрагменты поверхности"},tg_causticshard:{en:"Caustic Shard",es:"Fragmento Caústico",ru:"Едкий осколок"},unknowncorechip:{en:"Tactical Core Chip",es:"Chip de núcleo táctico",fr:"Puce tactique principale",ru:"Чип тактического ядра"},UnknownCarapace:{en:"Thargoid Carapace",de:"Thargoiden-Krustenschale",es:"Caparazón Thargoide",fr:"Carapace thargoid",pt:"Carapaça Thargoid",ru:"Таргоидский панцирь"},TG_BioMechanicalConduits:{en:"Bio-Mechanical Conduits",de:"Biomechanische Leiter",es:"Conductos biomecánicos",fr:"Conduits biomécaniques",pt:"Condutor Biomecânico",ru:"Биомеханические энергопроводники"},tg_causticgeneratorparts:{en:"Corrosive Mechanisms",es:"Mecanismos Corrosivos",ru:"Разъедающие механизмы"},tg_abrasion02:{en:"Phasing Membrane Residue",de:"Phasenmembranreste",es:"Residuo de Membrana Fásica",pt:"Resíduo de membrana faseada",ru:"Остаток фазирующей мембраны"},UnknownEnergyCell:{en:"Thargoid Energy Cell",de:"Thargoiden-Energiezelle",es:"Célula de energía Thargoide",fr:"Cellule d’énergie thargoid",pt:"Célula de Energia Thargoid",ru:"Таргоидская энергоячейка"},TG_WreckageComponents:{en:"Wreckage Components",de:"Wrackteilkomponenten",es:"Restos de accidentes",fr:"Débris d’épave",pt:"Restos de componentes",ru:"Обломки кораблекрушений"},tg_causticcrystal:{en:"Caustic Crystal",es:"Cristal Caústico",ru:"Едкий кристалл"},UnknownTechnologyComponents:{en:"Thargoid Technological Components",de:"Technologiekomponenten der Thargoiden",es:"Componentes tecnológicos Thargoides",fr:"Composants technologiques thargoids",pt:"Componentes Tecnológicos Thargoid",ru:"Компоненты таргоидской техники"},TG_WeaponParts:{en:"Weapon Parts",de:"Waffenteile",es:"Piezas de armamento",fr:"Pièces d’armement",pt:"Peças de Arma",ru:"Детали вооружения"},tg_abrasion01:{en:"Heat Exposure Specimen",es:"Especimen de Exposición Térmica",fr:"Spécimen exposé à la chaleur",pt:"Espécime de exposição ao calor",ru:"Образец теплового воздействия"},TG_PropulsionElement:{en:"Propulsion Elements",de:"Schubantriebelemente",es:"Elementos de propulsión",fr:"Éléments de propulsion",pt:"Elementos de Propulsão",ru:"Реактивные элементы"},UnknownEnergySource:{en:"Sensor Fragment",de:"Sensorenfragment",es:"Fragmento de sensor",fr:"Fragment de capteur",pt:"Fragmento de sensor",ru:"Обломок сенсора"},UnknownOrganicCircuitry:{en:"Thargoid Organic Circuitry",de:"Organischer Schaltkreis der Thargoiden",es:"Circuitería orgánica Thargoide",fr:"Circuits organiques thargoids",pt:"Circuito Orgânico Thargoid",ru:"Таргоидская органическая схема"},TemperedAlloys:{en:"Tempered Alloys",de:"Vergütete Legierungen",es:"Aleaciones templadas",fr:"Alliages trempés",pt:"Ligas temperadas",ru:"Закаленные сплавы"},HeatResistantCeramics:{en:"Heat Resistant Ceramics",de:"Hitzefeste Keramik",es:"Cerámicas resistentes al calor",fr:"Céramiques résistantes à la chaleur",pt:"Cerâmicas termoresistentes",ru:"Жаропрочная керамика"},PrecipitatedAlloys:{en:"Precipitated Alloys",de:"Gehärtete Legierungen",es:"Aleaciones de precipitación",fr:"Alliages précipités",pt:"Ligas precipitadas",ru:"Осажденные сплавы"},ThermicAlloys:{en:"Thermic Alloys",de:"Thermische Legierungen",es:"Aleaciones térmicas",fr:"Alliages thermiques",pt:"Ligas térmicas",ru:"Термические сплавы"},MilitaryGradeAlloys:{en:"Military Grade Alloys",de:"Militärqualitätslegierungen",es:"Aleaciones de grado militar",fr:"Alliages militaires",pt:"Ligas nível militar",ru:"Сплавы военного класса"},BulkScanData:{en:"Anomalous Bulk Scan Data",de:"Anormale Massen-Scan-Daten",es:"Datos de escáner en bruto anómalos",fr:"Fichier volumineux de données d’analyse anormal",pt:"Dados brutos de escâner anômalos",ru:"Аномальный массив данных сканирования"},ScanArchives:{en:"Unidentified Scan Archives",de:"Unidentifizierte Scan-Archive",es:"Archivos de escáner no identificados",fr:"Données d’analyse archivées non identifiées",pt:"Arquivos de escaneamento não identificados",ru:"Неопознанные архивы сканирования"},ScanDatabanks:{en:"Classified Scan Databanks",de:"Scan-Datenbanken unter Verschluss",es:"Datos de escáner clasificados",fr:"Banques de données d’analyse classifiées",pt:"Banco de dados de escaneamento confidenciais",ru:"Засекреченные базы данных сканирования"},EncodedScanData:{en:"Divergent Scan Data",de:"Divergente Scandaten",es:"Datos de escáner divergentes",fr:"Données d’analyse divergentes",pt:"Dados escaneados divergentes",ru:"Неформатные данные сканирования"},ClassifiedScanData:{en:"Classified Scan Fragment",de:"Geheimes Scan-Fragment",es:"Fragmento de escáner clasificado",fr:"Données d’analyse classifiées parcellaires",pt:"Fragmentos de escaneamentos confidenciais",ru:"Засекреченные фрагменты данных сканирования"},ScrambledEmissionData:{en:"Exceptional Scrambled Emission Data",de:"Außergewöhnliche verschlüsselte Emissionsdaten",es:"Datos de transmisiones codificadas excepcionales",fr:"Données d’émissions brouillées exceptionnelles",pt:"Exceção nos dados de emissão embaralhados",ru:"Исключительные зашифрованные данные об излучении"},ArchivedEmissionData:{en:"Irregular Emission Data",de:"Irreguläre Emissionsdaten",es:"Datos de emisión irregulares",fr:"Données d’émissions aberrantes",pt:"Dados de emissão irregulares",ru:"Нестандартные данные об излучении"},EmissionData:{en:"Unexpected Emission Data",de:"Unerwartete Emissionsdaten",es:"Datos de emisión inesperados",fr:"Données d’émissions inattendues",pt:"Dados de emissão inesperados",ru:"Неожиданные данные об излучении"},DecodedEmissionData:{en:"Decoded Emission Data",de:"Entschlüsselte Emissionsdaten",es:"Datos de emisión descodificados",fr:"Données d’émissions décodées",pt:"Dados de emissão decodificados",ru:"Расшифрованные данные об излучении"},CompactEmissionsData:{en:"Abnormal Compact Emissions Data",de:"Anormale kompakte Emissionsdaten",es:"Compresión de datos de transmisiones anormal",fr:"Données d’émissions compactes anormales",pt:"Dados de emissão compactos anormais",ru:"Аномальные компактные данные об излучении"},LegacyFirmware:{en:"Specialised Legacy Firmware",de:"Spezial-Legacy-Firmware",es:"Firmware heredado especializado",fr:"Micrologiciel spécialisé périmé",pt:"Firmware especializado antigo",ru:"Специальные микропрограммы предыдущего поколения"},ConsumerFirmware:{en:"Modified Consumer Firmware",de:"Modifizierte Consumer-Firmware",es:"Firmware de consumo modificado",fr:"Micrologiciel consommateur modifié",pt:"Firmware de consumo modificado",ru:"Измененные пользовательские микропрограммы"},IndustrialFirmware:{en:"Cracked Industrial Firmware",de:"Gecrackte Industrie-Firmware",es:"Firmware industrial pirateado",fr:"Micrologiciel industriel piraté",pt:"Firmware industrial quebrado",ru:"Взломанные промышленные микропрограммы"},SecurityFirmware:{en:"Security Firmware Patch",de:"Sicherheits-Firmware-Patch",es:"Parche de firmware de seguridad",fr:"Mise à jour de micrologiciel de sécurité",pt:"Atualização de firmware de segurança",ru:"Обновление для защитной микропрограммы"},EmbeddedFirmware:{en:"Modified Embedded Firmware",de:"Modifizierte integrierte Firmware",es:"Firmware integrado modificado",fr:"Micrologiciel intégré modifié",pt:"Firmware embutido modificado",ru:"Измененные встроенные микропрограммы"},EncryptedFiles:{en:"Unusual Encrypted Files",de:"Ungewöhnliche verschlüsselte Files",es:"Ficheros encriptados inusuales",fr:"Fichiers cryptés inhabituels",pt:"Arquivos criptografados incomuns",ru:"Особые зашифрованные файлы"},EncryptionCodes:{en:"Tagged Encryption Codes",de:"Getaggte Verschlüsselungscodes",es:"Códigos de encriptación marcados",fr:"Clés de cryptage balisées",pt:"Códigos de encriptação rotulados",ru:"Меченые шифровальные коды"},SymmetricKeys:{en:"Open Symmetric Keys",de:"Offene symmetrische Schlüssel",es:"Claves simétricas abiertas",fr:"Clés symétriques ouvertes",pt:"Chaves simétricas abertas",ru:"Открытые симметричные ключи"},EncryptionArchives:{en:"Atypical Encryption Archives",de:"Atypische Verschlüsselungsarchive",es:"Archivos encriptados atípicos",fr:"Archives cryptées atypiques",pt:"Arquivos de encriptação atípicos",ru:"Нетипичные архивы шифрования"},AdaptiveEncryptors:{en:"Adaptive Encryptors Capture",de:"Adaptive Verschlüsselungserfassung",es:"Captura de encriptadores adaptativos",fr:"Capture de cryptage évolutif",pt:"Encriptadores adaptativos capturados",ru:"Захват адаптивного шифровальщика"},Guardian_ModuleBlueprint:{en:"Guardian Module Blueprint Segment",de:"Guardian-Modulbauplansegment",es:"Segmento de plano de módulo de guardián",fr:"Fragment de plan de module - Guardians",pt:"Segmento de diagrama de módulo Guardian",ru:"Фрагмент чертежа модуля Стражей"},Guardian_WeaponBlueprint:{en:"Guardian Weapon Blueprint Segment",de:"Guardian-Waffenbauplansegment",es:"Segmento de plano de armamento de guardián",fr:"Fragment de plan d’arme - Guardians",pt:"Segmento de diagrama de arma Guardian",ru:"Фрагмент чертежа оружия Стражей"},AncientBiologicalData:{en:"Pattern Alpha Obelisk Data",de:"Alpha-Muster-Obeliskendaten",es:"Datos de obelisco de patrón alfa",fr:"Données d’obélisque de type alpha",pt:"Dados de Obelisco de Padrão Alfa",ru:"Данные с обелиска «Альфа»"},AncientCulturalData:{en:"Pattern Beta Obelisk Data",de:"Beta-Muster-Obeliskendaten",es:"Datos de obelisco de patrón beta",fr:"Données d’obélisque de type bêta",pt:"Dados de Obelisco de Padrão Beta",ru:"Данные с обелиска «Бета»"},AncientLanguageData:{en:"Pattern Delta Obelisk Data",de:"Delta-Muster-Obeliskendaten",es:"Datos de obelisco de patrón delta",fr:"Données d’obélisque de type delta",pt:"Dados de Obelisco de Padrão Delta",ru:"Данные с обелиска «Дельта»"},AncientTechnologicalData:{en:"Pattern Epsilon Obelisk Data",de:"Epsilon-Muster-Obeliskendaten",es:"Datos de obelisco de patrón epsilon",fr:"Données d’obélisque de type epsilon",pt:"Dados de Obelisco de Padrão Epsilon",ru:"Данные с обелиска «Эпсилон»"},AncientHistoricalData:{en:"Pattern Gamma Obelisk Data",de:"Gamma-Muster-Obeliskendaten",es:"Datos de obelisco de patrón gamma",fr:"Données d’obélisque de type gamma",pt:"Dados de Obelisco de Padrão Gama",ru:"Данные с обелиска «Гамма»"},Guardian_VesselBlueprint:{en:"Guardian Vessel Blueprint Segment",de:"Guardian-Schiffsbauplansegment",es:"Segmento de plano de nave de guardián",fr:"Fragment de plan de vaisseau - Guardians",pt:"Segmento de diagrama de nave Guardian",ru:"Фрагмент чертежа судна Стражей"},ShieldCycleRecordings:{en:"Distorted Shield Cycle Recordings",de:"Gestörte Schildzyklus-Aufzeichnungen",es:"Registros de ciclo de escudo distorsionados",fr:"Enregistrements de cycles de bouclier déformés",pt:"Registros distorcidos de ciclos de escudo",ru:"Поврежденные цикличные записи щита"},ShieldSoakAnalysis:{en:"Inconsistent Shield Soak Analysis",de:"Inkonsistente Schildleistungsanalysen",es:"Análisis de absorción de escudos inconsistente",fr:"Analyse d’absorption de bouclier incohérente",pt:"Análise inconsistente de escudo atingidos",ru:"Неполный анализ поглощения щита"},ShieldDensityReports:{en:"Untypical Shield Scans",de:"Untypische Schildscans",es:"Escáner de escudos atípico",fr:"Analyses de bouclier atypiques",pt:"Escaneamentos de escudo atípicos",ru:"Нетипичные данные сканирования щитов"},ShieldPatternAnalysis:{en:"Aberrant Shield Pattern Analysis",de:"Abweichende Schildeinsatz-Analysen",es:"Análisis de patrones de escudo aberrantes",fr:"Analyse de modèle de bouclier aberrante",pt:"Análise de padrão de escudos aberrante",ru:"Анализ аномального поведения щита"},ShieldFrequencyData:{en:"Peculiar Shield Frequency Data",de:"Verdächtige Schildfrequenz-Daten",es:"Datos de frecuencias de escudo peculiares",fr:"Données de fréquences de bouclier singulières",pt:"Dados da frequência de escudos peculiares",ru:"Специфические данные о частоте щитов"},TG_StructuralData:{en:"Thargoid Structural Data",de:"Thargoiden-Strukturdaten",es:"Datos estructurales Thargoides",fr:"Données de structure thargoid",pt:"Dados de Estrutura Thargoid",ru:"Данные о структуре таргоидского объекта"},tg_shutdowndata:{en:"Massive Energy Surge Analytics",es:"Análisis de Sobrecarga de Energía Masiva(Thargoide)",ru:"Параметры сильного энергетического импульса"},TG_ShipFlightData:{en:"Ship Flight Data",de:"Schiffsflugdaten",es:"Datos de vuelos de nave",fr:"Données de vol de vaisseau",pt:"Dados de Voo da Nave",ru:"Полетные данные корабля"},tg_interdictiondata:{en:"Thargoid Interdiction Telemetry",es:"Telemetría de Interdicción Thargoide",ru:"Телеметрия перехвата таргоидами"},TG_CompositionData:{en:"Thargoid Material Composition Data",de:"Materialzusammensetzungsdaten der Thargoiden",es:"Datos de composición material Thargoide",fr:"Données de composition de matériau thargoid",pt:"Dados de Composição de Material Thargoid",ru:"Данные о составе таргоидских материалов"},UnknownShipSignature:{en:"Thargoid Ship Signature",de:"Thargoiden-Schiffssignatur",es:"Firma térmica de nave Thargoide",fr:"Signature de vaisseau thargoid",pt:"Assinatura de Nave Thargoid",ru:"Сигнатура таргоидского корабля"},TG_ShipSystemsData:{en:"Ship Systems Data",de:"Schiffssysteme-Daten",es:"Datos de sistemas de nave",fr:"Données de systèmes de vaisseau",pt:"Dados do Sistema da Nave",ru:"Данные бортовых систем корабля"},TG_ResidueData:{en:"Thargoid Residue Data",de:"Thargoiden-Rückstandsdaten",es:"Datos residuales Thargoides",fr:"Données de résidu thargoid",pt:"Dados de Resíduos Thargoid",ru:"Данные об осадке таргоидского происхождения"},UnknownWakeData:{en:"Thargoid Wake Data",de:"Thargoiden-Sogwolkendaten",es:"Datos de estela Thargoide",fr:"Données de sillage thargoid",pt:"Dados de Rastro Thargoid",ru:"Данные следа таргоидского корабля"},DisruptedWakeEchoes:{en:"Atypical Disrupted Wake Echoes",de:"Atypische FSA-Stör-Aufzeichnungen",es:"Ecos de estelas interrumpidas atípicos",fr:"Échos de sillages perturbés atypiques",pt:"Interferência atípica no eco de rastros",ru:"Атипичное эхо поврежденного следа"},FSDTelemetry:{en:"Anomalous FSD Telemetry",de:"Anormale FSA-Telemetrie",es:"Telemetría de MDD anómala",fr:"Télémétrie FSD anormale",pt:"Telemetria anômala de MDD",ru:"Аномальная телеметрия FSD"},WakeSolutions:{en:"Strange Wake Solutions",de:"Seltsame FSA-Zielorte",es:"Extrañas soluciones de estelas",fr:"Solutions de sillage anormales",pt:"Soluções de rastro estranhas",ru:"Странные расчеты следа"},HyperspaceTrajectories:{en:"Eccentric Hyperspace Trajectories",de:"Exzentrische Hyperraum-Routen",es:"Trayectorias de hiperespacio excéntricas",fr:"Trajectoires d’hyperespace excentriques",pt:"Trajetórias excêntricas de hiperespaço",ru:"Аномальные траектории в гиперпространстве"},DataminedWake:{en:"Datamined Wake Exceptions",de:"FSA-Daten-Cache-Ausnahmen",es:"Excepciones en análisis de estelas",fr:"Explorations de données de sillages anormales",pt:"Exceções de dados processados de rastros",ru:"Исключения из глубинного анализа данных следа"}};var MATERIAL_NAMES=/* @__PURE__ */createLocalizedNameIndex(material_names_default);function getMaterialName(symbol,locale){return getLocalizedName(MATERIAL_NAMES,symbol,locale,"getMaterialName","symbol")}export{getMaterialName};//# sourceMappingURL=chunk-HRVIHQ4A.js.map
@@ -1 +0,0 @@
1
- import{normalizeKey,CATALOGUE_KEY,findInKeyIndex}from"./chunk-BKWLI44T.js";import{requireString}from"./chunk-PKWVG2JY.js";var CANONICAL_LOCALE=Object.freeze({en:"en",de:"de",es:"es",fr:"fr",hu:"hu",it:"it",ka:"ka",pt:"pt","pt-br":"pt-BR",ru:"ru","zh-cn":"zh-CN"});function canonicalLocale(locale){return Object.hasOwn(CANONICAL_LOCALE,locale)?CANONICAL_LOCALE[locale]:void 0}function localeCandidates(locale,label){const normalized=requireString(locale,label).trim().replaceAll("_","-").toLowerCase();if(normalized==="zh"||normalized==="zh-hans"||normalized.startsWith("zh-hans-")){return["zh-CN"]}if(normalized.startsWith("zh-")&&normalized!=="zh-cn")return[];const exact=canonicalLocale(normalized);const language=canonicalLocale(normalized.split("-",1)[0]);if(exact===void 0)return language===void 0?[]:[language];return language===void 0||language===exact?[exact]:[exact,language]}function createLocalizedNameIndex(names){const index=/* @__PURE__ */Object.create(null);for(const[identifier,name]of Object.entries(names)){const key=normalizeKey(identifier,CATALOGUE_KEY);if(!Object.hasOwn(index,key))index[key]=name}return Object.freeze(index)}function createDeduplicatedLocalizedNameIndex(catalogue){const index=/* @__PURE__ */Object.create(null);for(const[identifier,nameKey]of Object.entries(catalogue.nameKeys)){const name=catalogue.names[nameKey];if(name===void 0)continue;const key=normalizeKey(identifier,CATALOGUE_KEY);if(!Object.hasOwn(index,key))index[key]=name}return Object.freeze(index)}function selectLocalizedName(names,locale,functionName){const candidates=localeCandidates(locale,`${functionName}: locale`);if(names===null)return null;for(const candidate of candidates){const name=names[candidate];if(name!==void 0)return name}return null}function getLocalizedText(names,locale,functionName){return selectLocalizedName(names,locale,functionName)}function getLocalizedName(names,identifier,locale,functionName,identifierName){const record=findInKeyIndex(names,identifier,`${functionName}: ${identifierName}`);return selectLocalizedName(record,locale,functionName)}export{createDeduplicatedLocalizedNameIndex,createLocalizedNameIndex,getLocalizedName,getLocalizedText};//# sourceMappingURL=chunk-M5IBENCW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/i18n/internal/localized-name.ts"],"names":["normalizeKey","CATALOGUE_KEY","findInKeyIndex","requireString","CANONICAL_LOCALE","Object","freeze","en","de","es","fr","hu","it","ka","pt","ru","canonicalLocale","locale","hasOwn","localeCandidates","label","normalized","trim","replaceAll","toLowerCase","startsWith","exact","language","split","createLocalizedNameIndex","names","index","create","identifier","name","entries","key","createDeduplicatedLocalizedNameIndex","catalogue","nameKey","nameKeys","selectLocalizedName","functionName","candidates","candidate","getLocalizedText","getLocalizedName","identifierName","record"],"mappings":"O,mHA4BA,IAAMI,iBAA8DC,OAAOC,OAAO,CAC9EC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJC,GAAI,KACJ,QAAS,QACTC,GAAI,KACJ,QAAS,UAIb,SAASC,gBAAgBC,QACrB,OAAOZ,OAAOa,OAAOd,iBAAkBa,QAAUb,iBAAiBa,aAAU,CAChF,CAMA,SAASE,iBAAiBF,OAAgBG,OACtC,MAAMC,WAAalB,cAAcc,OAAQG,OAAOE,OAAOC,WAAW,IAAK,KAAKC,cAC5E,GAAIH,aAAe,MAAQA,aAAe,WAAaA,WAAWI,WAAW,YAAa,CACtF,MAAO,CAAC,QACZ,CACA,GAAIJ,WAAWI,WAAW,QAAUJ,aAAe,QAAA,MAAgB,GACnE,MAAMK,MAAQV,gBAAgBK,YAC9B,MAAMM,SAAWX,gBAAgBK,WAAWO,MAAM,IAAK,GAAG,IAC1D,GAAIF,aAAU,EAAW,OAAOC,gBAAa,EAAY,GAAK,CAACA,UAC/D,OAAOA,gBAAa,GAAaA,WAAaD,MAAQ,CAACA,OAAS,CAACA,MAAOC,SAC5E,CAGO,SAASE,yBAAyBC,OACrC,MAAMC,qBAAQ1B,OAAO2B,OAAO,MAC5B,IAAA,MAAYC,WAAYC,QAAS7B,OAAO8B,QAAQL,OAAQ,CACpD,MAAMM,IAAMpC,aAAaiC,WAAYhC,eACrC,IAAKI,OAAOa,OAAOa,MAAOK,KAAML,MAAMK,KAAOF,IACjD,CACA,OAAO7B,OAAOC,OAAOyB,MACzB,CAGO,SAASM,qCACZC,WAEA,MAAMP,qBAAQ1B,OAAO2B,OAAO,MAC5B,IAAA,MAAYC,WAAYM,WAAYlC,OAAO8B,QAAQG,UAAUE,UAAW,CACpE,MAAMN,KAAOI,UAAUR,MAAMS,SAC7B,GAAIL,YAAS,EAAW,SACxB,MAAME,IAAMpC,aAAaiC,WAAYhC,eACrC,IAAKI,OAAOa,OAAOa,MAAOK,KAAML,MAAMK,KAAOF,IACjD,CACA,OAAO7B,OAAOC,OAAOyB,MACzB,CAGA,SAASU,oBACLX,MACAb,OACAyB,cAEA,MAAMC,WAAaxB,iBAAiBF,OAAQ,GAAGyB,wBAC/C,GAAIZ,QAAU,KAAM,OAAO,KAC3B,IAAA,MAAWc,aAAaD,WAAY,CAChC,MAAMT,KAAOJ,MAAMc,WACnB,GAAIV,YAAS,EAAW,OAAOA,IACnC,CACA,OAAO,IACX,CAGO,SAASW,iBACZf,MACAb,OACAyB,cAEA,OAAOD,oBAAoBX,MAAOb,OAAQyB,aAC9C,CAGO,SAASI,iBACZhB,MACAG,WACAhB,OACAyB,aACAK,gBAEA,MAAMC,OAAS9C,eAAe4B,MAAOG,WAAY,GAAGS,iBAAiBK,kBACrE,OAAON,oBAAoBO,OAAQ/B,OAAQyB,aAC/C,QAAAL,qCAAAR,yBAAAiB,iBAAAD"}
@@ -1 +0,0 @@
1
- import{filterByKey}from"./chunk-BKWLI44T.js";import{requireStringIfPresent}from"./chunk-PKWVG2JY.js";import{deepFreeze}from"./chunk-DURKO7JU.js";var pre_engineered_default=[{symbol:"Hpt_Mining_AbrBlstr_Fixed_Small",name:"Abrasion Blaster",blueprint:"AbrasionBlaster_FarReaching",grade:1,acquisition:"mercenary",mercCoinCost:400},{symbol:"Hpt_CausticMissile_Fixed_Medium",name:"Enzyme Missile Rack",blueprint:"EnzymeMissileRack_HighYield",grade:1,acquisition:"mercenary",mercCoinCost:850},{symbol:"Hpt_Slugshot_Gimbal_Small",name:"Fragment Cannon",blueprint:"FragmentCannonSmall_DoubleScreaming",grade:1,acquisition:"mercenary",mercCoinCost:800},{symbol:"Hpt_Slugshot_Gimbal_Large",name:"Fragment Cannon",blueprint:"FragmentCannonLarge_DoubleScreaming",grade:1,acquisition:"mercenary",mercCoinCost:950},{symbol:"Hpt_MiningLaser_Fixed_Small",name:"Mining Laser",blueprint:"MiningLaser_LongRange",grade:1,acquisition:"mercenary",mercCoinCost:450},{symbol:"Hpt_MultiCannon_Fixed_Medium",name:"Multi-Cannon",blueprint:"MultiCannon_Rapid",grade:1,acquisition:"mercenary",mercCoinCost:850},{symbol:"Hpt_Railgun_Fixed_Medium",name:"Rail Gun",blueprint:"RailGun_LongShot",grade:1,acquisition:"mercenary",mercCoinCost:950},{symbol:"Hpt_BasicMissileRack_Fixed_Medium",name:"Seeker Missile Rack",blueprint:"SeekerMissileRack_Drag",grade:1,acquisition:"mercenary",mercCoinCost:800},{symbol:"Hpt_BasicMissileRack_Fixed_Large",name:"Seeker Missile Rack",blueprint:"SeekerMissileRack_Drag",grade:1,acquisition:"mercenary",mercCoinCost:900},{symbol:"Hpt_BasicMissileRack_Fixed_Medium",name:"Seeker Missile Rack",blueprint:"SeekerMissileRack_LightWeightThermal",grade:1,acquisition:"mercenary",mercCoinCost:800},{symbol:"Hpt_BasicMissileRack_Fixed_Medium",name:"Seeker Missile Rack",blueprint:"SeekerMissileRackMedium_Lockdown",grade:1,acquisition:"mercenary",mercCoinCost:800},{symbol:"Hpt_BasicMissileRack_Fixed_Large",name:"Seeker Missile Rack",blueprint:"SeekerMissileRackLarge_Lockdown",grade:1,acquisition:"mercenary",mercCoinCost:900},{symbol:"Int_CargoRack_Size5_Class1",name:"Cargo Rack",blueprint:"CargoRackS5C1_Extended",grade:1,acquisition:"mercenary",mercCoinCost:550},{symbol:"Int_CargoRack_Size6_Class1",name:"Cargo Rack",blueprint:"CargoRackS6C1_Extended",grade:1,acquisition:"mercenary",mercCoinCost:550},{symbol:"Int_DetailedSurfaceScanner_Tiny",name:"Detailed Surface Scanner",blueprint:"DetailedSurfaceScanner_LongRange",grade:1,acquisition:"mercenary",mercCoinCost:350},{symbol:"Int_ModuleReinforcement_Size5_Class2",name:"Module Reinforcement Package",blueprint:"ModuleReinforcement_HeavyDuty",grade:1,acquisition:"mercenary",mercCoinCost:450},{symbol:"Int_PowerDistributor_Size3_Class2",name:"Power Distributor",blueprint:"PowerDistributorS3C2_SupportFocused",grade:1,acquisition:"mercenary",mercCoinCost:300},{symbol:"Int_PowerDistributor_Size3_Class5",name:"Power Distributor",blueprint:"PowerDistributorS3C5_SupportFocused",grade:1,acquisition:"mercenary",mercCoinCost:350},{symbol:"Int_PowerDistributor_Size4_Class2",name:"Power Distributor",blueprint:"PowerDistributorS4C2_SupportFocused",grade:1,acquisition:"mercenary",mercCoinCost:400},{symbol:"Int_PowerDistributor_Size4_Class5",name:"Power Distributor",blueprint:"PowerDistributorS4C5_SupportFocused",grade:1,acquisition:"mercenary",mercCoinCost:450},{symbol:"Int_PowerDistributor_Size5_Class5",name:"Power Distributor",blueprint:"PowerDistributor_Balanced",grade:1,acquisition:"mercenary",mercCoinCost:500},{symbol:"Int_PowerDistributor_Size6_Class5",name:"Power Distributor",blueprint:"PowerDistributorS6C5_SupportFocused",grade:1,acquisition:"mercenary",mercCoinCost:550},{symbol:"Hpt_Mining_AbrBlstr_Fixed_Small",name:"Abrasion Blaster",blueprint:"Weapon_LongRange",grade:5,acquisition:"communityGoal",modifiers:[{label:"DistributorDraw",method:"multiplicative",value:-.5},{label:"FalloffRange",method:"multiplicative",value:4},{label:"Integrity",method:"multiplicative",value:-.5},{label:"MaximumRange",method:"multiplicative",value:4},{label:"PowerDraw",method:"multiplicative",value:-.5},{label:"ThermalLoad",method:"multiplicative",value:-.5}]},{symbol:"Hpt_CausticMissile_Fixed_Medium",name:"Enzyme Missile Rack",blueprint:"Weapon_HighCapacity",grade:5,acquisition:"communityGoal",engineeringLocked:true,modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:.75},{label:"AmmoMaximum",method:"multiplicative",value:.25},{label:"Damage",method:"multiplicative",value:.5},{label:"Mass",method:"multiplicative",value:.6},{label:"PowerDraw",method:"multiplicative",value:.2}]},{symbol:"Hpt_Slugshot_Gimbal_Small",name:"Fragment Cannon",blueprint:"Weapon_DoubleShot",grade:5,acquisition:"communityGoal",experimental:"special_screening_shell",modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:1.6667},{label:"AmmoMaximum",method:"multiplicative",value:.67776},{label:"BurstInterval",method:"multiplicative",value:-.06},{label:"BurstSize",method:"overwrite",value:2},{label:"Mass",method:"multiplicative",value:.6},{label:"MaximumRange",method:"multiplicative",value:-.1},{label:"PowerDraw",method:"multiplicative",value:.2}]},{symbol:"Hpt_Slugshot_Gimbal_Large",name:"Fragment Cannon",blueprint:"Weapon_DoubleShot",grade:5,acquisition:"communityGoal",experimental:"special_screening_shell",modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:1.6667},{label:"AmmoMaximum",method:"multiplicative",value:.67776},{label:"BurstInterval",method:"multiplicative",value:-.06},{label:"BurstSize",method:"overwrite",value:2},{label:"Mass",method:"multiplicative",value:.6},{label:"MaximumRange",method:"multiplicative",value:-.1},{label:"PowerDraw",method:"multiplicative",value:.2}]},{symbol:"Hpt_Guardian_ShardCannon_Fixed_Medium",name:"Guardian Shard Cannon",blueprint:"Weapon_LongRange",grade:5,acquisition:"communityGoal",engineeringLocked:true,modifiers:[{label:"ArmourPenetration",method:"multiplicative",value:1.02},{label:"DistributorDraw",method:"multiplicative",value:5.05},{label:"Jitter",method:"additive",value:-3.5},{label:"Mass",method:"multiplicative",value:.5},{label:"MaximumRange",method:"multiplicative",value:4},{label:"PowerDraw",method:"multiplicative",value:1.3},{label:"ShotSpeed",method:"overwrite",value:1258.89},{label:"ThermalLoad",method:"multiplicative",value:15.5}]},{symbol:"Hpt_MultiCannon_Fixed_Medium",name:"Multi-Cannon",blueprint:"Weapon_RapidFire",grade:1,acquisition:"communityGoal",experimental:"special_phasing_sequence",modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:3},{label:"AmmoMaximum",method:"overwrite",value:6400},{label:"BurstInterval",method:"overwrite",value:.1},{label:"FalloffRange",method:"multiplicative",value:-.1},{label:"Jitter",method:"additive",value:3},{label:"MaximumRange",method:"multiplicative",value:-.5},{label:"RoundsPerShot",method:"additive",value:2}]},{symbol:"Hpt_Railgun_Fixed_Medium",name:"Rail Gun",blueprint:"Weapon_HighCapacity",grade:5,acquisition:"communityGoal",experimental:"special_feedback_cascade_cooled",modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:1},{label:"AmmoMaximum",method:"multiplicative",value:1},{label:"BurstInterval",method:"multiplicative",value:-.61145},{label:"FalloffRange",method:"multiplicative",value:5},{label:"Mass",method:"multiplicative",value:.9},{label:"MaximumRange",method:"multiplicative",value:1},{label:"PowerDraw",method:"multiplicative",value:.65},{label:"ReloadTime",method:"multiplicative",value:.25}]},{symbol:"Hpt_Railgun_Fixed_Medium_Burst",name:"Imperial Hammer Rail Gun",blueprint:"Weapon_HighCapacity",grade:5,acquisition:"communityGoal",experimental:"special_super_penetrator",modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:1},{label:"AmmoMaximum",method:"multiplicative",value:1},{label:"BurstInterval",method:"multiplicative",value:-.2635},{label:"Damage",method:"multiplicative",value:-.2},{label:"Mass",method:"multiplicative",value:.7},{label:"PowerDraw",method:"multiplicative",value:.25}]},{symbol:"Hpt_BasicMissileRack_Fixed_Medium",name:"Seeker Missile Rack",blueprint:"Weapon_HighCapacity",grade:1,acquisition:"communityGoal",experimental:"special_drag_munitions",modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:2},{label:"AmmoMaximum",method:"multiplicative",value:2},{label:"BurstInterval",method:"multiplicative",value:-.2},{label:"DistributorDraw",method:"overwrite",value:.34},{label:"Mass",method:"multiplicative",value:1.5},{label:"PowerDraw",method:"multiplicative",value:.25}]},{symbol:"Hpt_BasicMissileRack_Fixed_Medium",name:"Seeker Missile Rack",blueprint:"Weapon_HighCapacity",grade:5,acquisition:"communityGoal",experimental:"special_fsd_interrupt",modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:1},{label:"AmmoMaximum",method:"multiplicative",value:1},{label:"ArmourPenetration",method:"multiplicative",value:.4},{label:"BurstInterval",method:"multiplicative",value:-.1},{label:"Damage",method:"multiplicative",value:.35},{label:"Integrity",method:"multiplicative",value:1},{label:"Mass",method:"multiplicative",value:1.2},{label:"PowerDraw",method:"multiplicative",value:.3},{label:"ThermalLoad",method:"multiplicative",value:-.1}]},{symbol:"Hpt_BasicMissileRack_Fixed_Large",name:"Seeker Missile Rack",blueprint:"Weapon_HighCapacity",grade:5,acquisition:"communityGoal",experimental:"special_fsd_interrupt",modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:1},{label:"AmmoMaximum",method:"multiplicative",value:1},{label:"ArmourPenetration",method:"multiplicative",value:.4},{label:"BurstInterval",method:"multiplicative",value:-.1},{label:"Damage",method:"multiplicative",value:.35},{label:"Integrity",method:"multiplicative",value:1},{label:"Mass",method:"multiplicative",value:1.2},{label:"PowerDraw",method:"multiplicative",value:.3},{label:"ThermalLoad",method:"multiplicative",value:-.1}]},{symbol:"Hpt_ElectronicCountermeasure_Tiny",name:"Electronic Countermeasure",blueprint:"Misc_LightWeight",grade:5,acquisition:"communityGoal",modifiers:[{label:"Integrity",method:"multiplicative",value:1},{label:"Mass",method:"multiplicative",value:-.85},{label:"PowerDraw",method:"multiplicative",value:1}]},{symbol:"Hpt_CrimeScanner_Size0_Class5",name:"Kill Warrant Scanner",blueprint:"Sensor_FastScan",grade:5,acquisition:"communityGoal",modifiers:[{label:"Integrity",method:"multiplicative",value:-.5},{label:"MaxAngle",method:"multiplicative",value:-.3},{label:"PowerDraw",method:"multiplicative",value:.5},{label:"ScannerRange",method:"multiplicative",value:.65},{label:"ScannerTimeToScan",method:"multiplicative",value:-.8}]},{symbol:"Hpt_CrimeScanner_Size0_Class3",name:"Kill Warrant Scanner",blueprint:"Sensor_FastScan",grade:5,acquisition:"communityGoal",modifiers:[{label:"Integrity",method:"multiplicative",value:-.5},{label:"MaxAngle",method:"multiplicative",value:-.3},{label:"PowerDraw",method:"multiplicative",value:.5},{label:"ScannerRange",method:"multiplicative",value:.65},{label:"ScannerTimeToScan",method:"multiplicative",value:-.8}]},{symbol:"Hpt_PlasmaPointDefence_Turret_Tiny",name:"Point Defence",blueprint:"Misc_LightWeight",grade:5,acquisition:"communityGoal",modifiers:[{label:"Integrity",method:"multiplicative",value:-.5},{label:"Mass",method:"multiplicative",value:-.85},{label:"MaximumRange",method:"multiplicative",value:1},{label:"ThermalLoad",method:"multiplicative",value:.05}]},{symbol:"Int_PowerDistributor_Size3_Class5",name:"Power Distributor",blueprint:"PowerDistributor_PrioritySystems",grade:5,acquisition:"communityGoal",modifiers:[{label:"EnginesCapacity",method:"multiplicative",value:.45},{label:"EnginesRecharge",method:"multiplicative",value:.4},{label:"SystemsCapacity",method:"multiplicative",value:.45},{label:"SystemsRecharge",method:"multiplicative",value:.4},{label:"WeaponsCapacity",method:"multiplicative",value:-.25},{label:"WeaponsRecharge",method:"multiplicative",value:-.2}]},{symbol:"Int_PowerDistributor_Size3_Class2",name:"Power Distributor",blueprint:"PowerDistributor_PrioritySystems",grade:5,acquisition:"communityGoal",modifiers:[{label:"EnginesCapacity",method:"multiplicative",value:.45},{label:"EnginesRecharge",method:"multiplicative",value:.4},{label:"SystemsCapacity",method:"multiplicative",value:.45},{label:"SystemsRecharge",method:"multiplicative",value:.4},{label:"WeaponsCapacity",method:"multiplicative",value:-.25},{label:"WeaponsRecharge",method:"multiplicative",value:-.2}]},{symbol:"Int_PowerDistributor_Size4_Class5",name:"Power Distributor",blueprint:"PowerDistributor_PrioritySystems",grade:5,acquisition:"communityGoal",modifiers:[{label:"EnginesCapacity",method:"multiplicative",value:.45},{label:"EnginesRecharge",method:"multiplicative",value:.4},{label:"SystemsCapacity",method:"multiplicative",value:.45},{label:"SystemsRecharge",method:"multiplicative",value:.4},{label:"WeaponsCapacity",method:"multiplicative",value:-.25},{label:"WeaponsRecharge",method:"multiplicative",value:-.2}]},{symbol:"Int_PowerDistributor_Size4_Class2",name:"Power Distributor",blueprint:"PowerDistributor_PrioritySystems",grade:5,acquisition:"communityGoal",modifiers:[{label:"EnginesCapacity",method:"multiplicative",value:.45},{label:"EnginesRecharge",method:"multiplicative",value:.4},{label:"SystemsCapacity",method:"multiplicative",value:.45},{label:"SystemsRecharge",method:"multiplicative",value:.4},{label:"WeaponsCapacity",method:"multiplicative",value:-.25},{label:"WeaponsRecharge",method:"multiplicative",value:-.2}]},{symbol:"Int_PowerDistributor_Size6_Class5",name:"Power Distributor",blueprint:"PowerDistributor_PrioritySystems",grade:5,acquisition:"communityGoal",modifiers:[{label:"EnginesCapacity",method:"multiplicative",value:.45},{label:"EnginesRecharge",method:"multiplicative",value:.4},{label:"SystemsCapacity",method:"multiplicative",value:.45},{label:"SystemsRecharge",method:"multiplicative",value:.4},{label:"WeaponsCapacity",method:"multiplicative",value:-.25},{label:"WeaponsRecharge",method:"multiplicative",value:-.2}]},{symbol:"Int_Powerplant_Size3_Class5",name:"Power Plant",blueprint:"PowerPlant_Armoured",grade:5,acquisition:"communityGoal",modifiers:[{label:"HeatEfficiency",method:"multiplicative",value:.13},{label:"Integrity",method:"multiplicative",value:.95},{label:"Mass",method:"multiplicative",value:.2},{label:"PowerCapacity",method:"multiplicative",value:.52}]},{symbol:"Int_Powerplant_Size3_Class5",name:"Power Plant",blueprint:"PowerPlant_Boosted",grade:5,acquisition:"communityGoal",modifiers:[{label:"HeatEfficiency",method:"multiplicative",value:.35},{label:"Integrity",method:"multiplicative",value:-.3},{label:"PowerCapacity",method:"multiplicative",value:.6}]},{symbol:"Int_Powerplant_Size4_Class5",name:"Power Plant",blueprint:"PowerPlant_Boosted",grade:5,acquisition:"communityGoal",modifiers:[{label:"HeatEfficiency",method:"multiplicative",value:.35},{label:"Integrity",method:"multiplicative",value:-.3},{label:"PowerCapacity",method:"multiplicative",value:.6}]},{symbol:"Int_Powerplant_Size5_Class5",name:"Power Plant",blueprint:"PowerPlant_Boosted",grade:5,acquisition:"communityGoal",modifiers:[{label:"HeatEfficiency",method:"multiplicative",value:.35},{label:"Integrity",method:"overwrite",value:74},{label:"PowerCapacity",method:"multiplicative",value:.6}]},{symbol:"Int_Hyperdrive_Size3_Class5",name:"Frame Shift Drive",blueprint:"FSD_LongRange",grade:5,acquisition:"communityGoal",modifiers:[{label:"BootTime",method:"multiplicative",value:-.8},{label:"FSDHeatRate",method:"multiplicative",value:.2},{label:"FSDOptimalMass",method:"multiplicative",value:.7},{label:"Integrity",method:"multiplicative",value:-.3},{label:"Mass",method:"multiplicative",value:.3},{label:"PowerDraw",method:"multiplicative",value:.15}]},{symbol:"Int_Hyperdrive_Size4_Class5",name:"Frame Shift Drive",blueprint:"FSD_LongRange",grade:5,acquisition:"communityGoal",modifiers:[{label:"BootTime",method:"multiplicative",value:-.8},{label:"FSDHeatRate",method:"multiplicative",value:.2},{label:"FSDOptimalMass",method:"multiplicative",value:.7},{label:"Integrity",method:"multiplicative",value:-.3},{label:"Mass",method:"multiplicative",value:.3},{label:"PowerDraw",method:"multiplicative",value:.15}]},{symbol:"Int_Hyperdrive_Size6_Class5",name:"Frame Shift Drive",blueprint:"FSD_LongRange",grade:5,acquisition:"communityGoal",modifiers:[{label:"BootTime",method:"multiplicative",value:-.8},{label:"FSDHeatRate",method:"multiplicative",value:.2},{label:"FSDOptimalMass",method:"multiplicative",value:.7},{label:"Integrity",method:"multiplicative",value:-.3},{label:"Mass",method:"multiplicative",value:.3},{label:"PowerDraw",method:"multiplicative",value:.15}]},{symbol:"Int_CargoRack_Size5_Class1",name:"Cargo Rack",blueprint:"CargoRack_IncreasedCapacity",grade:5,acquisition:"communityGoal",modifiers:[{label:"CargoCapacity",method:"multiplicative",value:.34375}]},{symbol:"Int_CargoRack_Size6_Class1",name:"Cargo Rack",blueprint:"CargoRack_IncreasedCapacity",grade:5,acquisition:"communityGoal",modifiers:[{label:"CargoCapacity",method:"multiplicative",value:.34375}]},{symbol:"Int_ShieldGenerator_Size3_Class5",name:"Shield Generator",blueprint:"ShieldGenerator_Kinetic",grade:5,acquisition:"communityGoal",modifiers:[{label:"Integrity",method:"multiplicative",value:.2},{label:"KineticResistance",method:"additive",value:.18},{label:"PowerDraw",method:"multiplicative",value:.4},{label:"ThermicResistance",method:"additive",value:.42}]},{symbol:"Hpt_ATDumbfireMissile_Fixed_Medium",name:"AX Missile Rack",blueprint:"Weapon_HighCapacity",grade:5,acquisition:"techBroker",engineeringLocked:true,modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:1},{label:"AmmoMaximum",method:"multiplicative",value:1},{label:"BurstInterval",method:"multiplicative",value:-.3},{label:"Damage",method:"multiplicative",value:-.03},{label:"DistributorDraw",method:"multiplicative",value:-.2},{label:"Jitter",method:"additive",value:.5},{label:"Mass",method:"multiplicative",value:.7},{label:"PowerDraw",method:"multiplicative",value:.2},{label:"ReloadTime",method:"multiplicative",value:-.45}]},{symbol:"Hpt_ATDumbfireMissile_Fixed_Large",name:"AX Missile Rack",blueprint:"Weapon_HighCapacity",grade:5,acquisition:"techBroker",engineeringLocked:true,modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:1},{label:"AmmoMaximum",method:"multiplicative",value:1},{label:"BurstInterval",method:"multiplicative",value:-.3},{label:"Damage",method:"multiplicative",value:-.03},{label:"DistributorDraw",method:"multiplicative",value:-.2},{label:"Jitter",method:"additive",value:.5},{label:"Mass",method:"multiplicative",value:.7},{label:"PowerDraw",method:"multiplicative",value:.2},{label:"ReloadTime",method:"multiplicative",value:-.45}]},{symbol:"Hpt_ATMultiCannon_Gimbal_Medium",name:"Enhanced AX Multi-Cannon",blueprint:"Weapon_Overcharged",grade:5,acquisition:"techBroker",experimental:"special_auto_loader",engineeringLocked:true,modifiers:[{label:"Damage",method:"multiplicative",value:.1},{label:"PowerDraw",method:"multiplicative",value:.75},{label:"ThermalLoad",method:"multiplicative",value:3}]},{symbol:"Hpt_ATMultiCannon_Gimbal_Large",name:"Enhanced AX Multi-Cannon",blueprint:"Weapon_Overcharged",grade:5,acquisition:"techBroker",experimental:"special_auto_loader",engineeringLocked:true,modifiers:[{label:"Damage",method:"multiplicative",value:.1},{label:"PowerDraw",method:"multiplicative",value:.75},{label:"ThermalLoad",method:"multiplicative",value:3}]},{symbol:"Hpt_Guardian_GaussCannon_Fixed_Small",name:"Guardian Gauss Cannon",blueprint:"Weapon_RapidFire",grade:1,acquisition:"techBroker",engineeringLocked:true,modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:3},{label:"AmmoMaximum",method:"multiplicative",value:4},{label:"BurstInterval",method:"multiplicative",value:-.38237},{label:"BurstRateOfFire",method:"overwrite",value:10},{label:"BurstSize",method:"overwrite",value:4},{label:"Damage",method:"multiplicative",value:-.75214},{label:"DistributorDraw",method:"multiplicative",value:-.75},{label:"FalloffRange",method:"multiplicative",value:-.2},{label:"ThermalLoad",method:"multiplicative",value:-.75}]},{symbol:"Hpt_Guardian_GaussCannon_Fixed_Medium",name:"Guardian Gauss Cannon",blueprint:"Weapon_RapidFire",grade:1,acquisition:"techBroker",engineeringLocked:true,modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:3},{label:"AmmoMaximum",method:"multiplicative",value:4},{label:"BurstInterval",method:"multiplicative",value:-.38237},{label:"BurstRateOfFire",method:"overwrite",value:10},{label:"BurstSize",method:"overwrite",value:4},{label:"Damage",method:"multiplicative",value:-.75214},{label:"DistributorDraw",method:"multiplicative",value:-.75},{label:"FalloffRange",method:"multiplicative",value:-.2},{label:"ThermalLoad",method:"multiplicative",value:-.75}]},{symbol:"Hpt_Guardian_PlasmaLauncher_Fixed_Small",name:"Guardian Plasma Charger",blueprint:"Weapon_Overcharged",grade:1,acquisition:"techBroker",engineeringLocked:true,modifiers:[{label:"AmmoClipSize",method:"overwrite",value:20},{label:"ArmourPenetration",method:"multiplicative",value:.375},{label:"Damage",method:"multiplicative",value:.66},{label:"PowerDraw",method:"multiplicative",value:.3239},{label:"ShotSpeed",method:"multiplicative",value:4},{label:"ThermalLoad",method:"multiplicative",value:.5}]},{symbol:"Hpt_Guardian_PlasmaLauncher_Fixed_Medium",name:"Guardian Plasma Charger",blueprint:"Weapon_Overcharged",grade:1,acquisition:"techBroker",engineeringLocked:true,modifiers:[{label:"AmmoClipSize",method:"overwrite",value:20},{label:"ArmourPenetration",method:"multiplicative",value:.375},{label:"Damage",method:"multiplicative",value:.66},{label:"PowerDraw",method:"multiplicative",value:.3239},{label:"ShotSpeed",method:"multiplicative",value:4},{label:"ThermalLoad",method:"multiplicative",value:.5}]},{symbol:"Hpt_Guardian_ShardCannon_Fixed_Small",name:"Guardian Shard Cannon",blueprint:"Weapon_LongRange",grade:1,acquisition:"techBroker",engineeringLocked:true,modifiers:[{label:"ArmourPenetration",method:"multiplicative",value:1.02},{label:"DistributorDraw",method:"multiplicative",value:4.2769},{label:"FalloffRange",method:"overwrite",value:1500},{label:"Jitter",method:"additive",value:-3.5},{label:"Mass",method:"multiplicative",value:.5},{label:"MaximumRange",method:"overwrite",value:3e3},{label:"PowerDraw",method:"multiplicative",value:1.3},{label:"ShotSpeed",method:"overwrite",value:3568.6},{label:"ThermalLoad",method:"multiplicative",value:15.5}]},{symbol:"Hpt_Guardian_ShardCannon_Fixed_Medium",name:"Guardian Shard Cannon",blueprint:"Weapon_LongRange",grade:1,acquisition:"techBroker",engineeringLocked:true,modifiers:[{label:"ArmourPenetration",method:"multiplicative",value:1.02},{label:"DistributorDraw",method:"overwrite",value:3.43},{label:"FalloffRange",method:"overwrite",value:1500},{label:"Jitter",method:"additive",value:-3.5},{label:"Mass",method:"multiplicative",value:.5},{label:"MaximumRange",method:"overwrite",value:3e3},{label:"PowerDraw",method:"multiplicative",value:1.3},{label:"ShotSpeed",method:"overwrite",value:6299.209},{label:"ThermalLoad",method:"multiplicative",value:15.5}]},{symbol:"Hpt_MiningLaser_Fixed_Small",name:"Mining Laser",blueprint:"Weapon_LongRange",grade:5,acquisition:"techBroker",experimental:"special_incendiary_rounds",modifiers:[{label:"Damage",method:"multiplicative",value:-.05},{label:"DistributorDraw",method:"multiplicative",value:-.5},{label:"FalloffRange",method:"multiplicative",value:7.3333},{label:"Integrity",method:"multiplicative",value:-.5},{label:"MaximumRange",method:"multiplicative",value:4},{label:"PowerDraw",method:"multiplicative",value:-.5},{label:"ThermalLoad",method:"multiplicative",value:-.83}]},{symbol:"Hpt_BasicMissileRack_Fixed_Medium",name:"Seeker Missile Rack",blueprint:"Weapon_HighCapacity",grade:5,acquisition:"techBroker",experimental:"special_thermal_cascade",modifiers:[{label:"AmmoClipSize",method:"multiplicative",value:1},{label:"AmmoMaximum",method:"multiplicative",value:1},{label:"BurstInterval",method:"multiplicative",value:-.1},{label:"DistributorDraw",method:"multiplicative",value:-.4},{label:"Integrity",method:"multiplicative",value:-.6},{label:"Mass",method:"multiplicative",value:-.9},{label:"PowerDraw",method:"multiplicative",value:-.2}]},{symbol:"Hpt_HeatSinkLauncher_Turret_Tiny",name:"Heat Sink Launcher",blueprint:"Misc_HeatSinkCapacity",grade:1,acquisition:"techBroker",modifiers:[{label:"AmmoMaximum",method:"multiplicative",value:1},{label:"ReloadTime",method:"multiplicative",value:.75}]},{symbol:"Int_Hyperdrive_Size5_Class5",name:"Frame Shift Drive",blueprint:"FSD_LongRange",grade:5,acquisition:"techBroker",modifiers:[{label:"BootTime",method:"multiplicative",value:-.8},{label:"FSDHeatRate",method:"multiplicative",value:.2},{label:"FSDOptimalMass",method:"multiplicative",value:.7},{label:"Integrity",method:"multiplicative",value:-.3},{label:"Mass",method:"multiplicative",value:.3},{label:"PowerDraw",method:"multiplicative",value:.15}]},{symbol:"Int_Hyperdrive_Overcharge_Size2_Class5",name:"Frame Shift Drive (SCO)",blueprint:"FSD_LongRange",grade:5,acquisition:"techBroker",modifiers:[{label:"BootTime",method:"multiplicative",value:-.8},{label:"FSDHeatRate",method:"multiplicative",value:.2},{label:"FSDOptimalMass",method:"multiplicative",value:.7},{label:"Integrity",method:"multiplicative",value:-.3},{label:"Mass",method:"multiplicative",value:.3},{label:"PowerDraw",method:"multiplicative",value:.15}]},{symbol:"Int_Hyperdrive_Overcharge_Size3_Class5",name:"Frame Shift Drive (SCO)",blueprint:"FSD_LongRange",grade:5,acquisition:"techBroker",modifiers:[{label:"BootTime",method:"multiplicative",value:-.8},{label:"FSDHeatRate",method:"multiplicative",value:.2},{label:"FSDOptimalMass",method:"multiplicative",value:.7},{label:"Integrity",method:"multiplicative",value:-.3},{label:"Mass",method:"multiplicative",value:.3},{label:"PowerDraw",method:"multiplicative",value:.15}]},{symbol:"Int_Hyperdrive_Overcharge_Size4_Class5",name:"Frame Shift Drive (SCO)",blueprint:"FSD_LongRange",grade:5,acquisition:"techBroker",modifiers:[{label:"BootTime",method:"multiplicative",value:-.8},{label:"FSDHeatRate",method:"multiplicative",value:.2},{label:"FSDOptimalMass",method:"multiplicative",value:.7},{label:"Integrity",method:"multiplicative",value:-.3},{label:"Mass",method:"multiplicative",value:.3},{label:"PowerDraw",method:"multiplicative",value:.15}]},{symbol:"Int_Hyperdrive_Overcharge_Size5_Class5",name:"Frame Shift Drive (SCO)",blueprint:"FSD_LongRange",grade:5,acquisition:"techBroker",modifiers:[{label:"BootTime",method:"multiplicative",value:-.8},{label:"FSDHeatRate",method:"multiplicative",value:.2},{label:"FSDOptimalMass",method:"multiplicative",value:.7},{label:"Integrity",method:"multiplicative",value:-.3},{label:"Mass",method:"multiplicative",value:.3},{label:"PowerDraw",method:"multiplicative",value:.15}]},{symbol:"Int_Hyperdrive_Overcharge_Size6_Class5",name:"Frame Shift Drive (SCO)",blueprint:"FSD_LongRange",grade:5,acquisition:"techBroker",modifiers:[{label:"BootTime",method:"multiplicative",value:-.8},{label:"FSDHeatRate",method:"multiplicative",value:.2},{label:"FSDOptimalMass",method:"multiplicative",value:.7},{label:"Integrity",method:"multiplicative",value:-.3},{label:"Mass",method:"multiplicative",value:.3},{label:"PowerDraw",method:"multiplicative",value:.15}]},{symbol:"Int_Hyperdrive_Overcharge_Size7_Class5",name:"Frame Shift Drive (SCO)",blueprint:"FSD_LongRange",grade:5,acquisition:"techBroker",modifiers:[{label:"BootTime",method:"multiplicative",value:-.8},{label:"FSDHeatRate",method:"multiplicative",value:.2},{label:"FSDOptimalMass",method:"multiplicative",value:.7},{label:"Integrity",method:"multiplicative",value:-.3},{label:"Mass",method:"multiplicative",value:.3},{label:"PowerDraw",method:"multiplicative",value:.15}]},{symbol:"Int_DetailedSurfaceScanner_Tiny",name:"Detailed Surface Scanner",blueprint:"Sensor_Expanded",grade:5,acquisition:"techBroker",modifiers:[{label:"DSS_PatchRadius",method:"multiplicative",value:1}]},{symbol:"Hpt_FlakMortar_Turret_Medium",name:"Festive Green Remote Release Flak Launcher",blueprint:"Decorative_Green",grade:5,acquisition:"eventReward",modifiers:[{label:"Damage",method:"multiplicative",value:-.99}]},{symbol:"Hpt_FlakMortar_Turret_Medium",name:"Festive Red Remote Release Flak Launcher",blueprint:"Decorative_Red",grade:5,acquisition:"eventReward",modifiers:[{label:"Damage",method:"multiplicative",value:-.99}]},{symbol:"Hpt_FlakMortar_Turret_Medium",name:"Festive Yellow Remote Release Flak Launcher",blueprint:"Decorative_Yellow",grade:5,acquisition:"eventReward",modifiers:[{label:"Damage",method:"multiplicative",value:-.99}]}];var PRE_ENGINEERED_MODULES=deepFreeze(pre_engineered_default);function getPreEngineeredVariants(symbol){return filterByKey(PRE_ENGINEERED_MODULES,"symbol",symbol,"getPreEngineeredVariants: symbol")}function isPreEngineered(symbol){requireStringIfPresent(symbol,"isPreEngineered: symbol");return getPreEngineeredVariants(symbol).length>0}export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered};//# sourceMappingURL=chunk-MTAGULIO.js.map
@@ -1 +0,0 @@
1
- import{INTERNAL_MODULES}from"./chunk-CTJQPQRA.js";import{UTILITY_MODULES}from"./chunk-3IMWUYXJ.js";import{CORE_MODULES}from"./chunk-O72KI7RP.js";import{HARDPOINT_MODULES}from"./chunk-EJMNNQIS.js";var ALL_MODULES=Object.freeze([...CORE_MODULES,...INTERNAL_MODULES,...HARDPOINT_MODULES,...UTILITY_MODULES]);export{ALL_MODULES};//# sourceMappingURL=chunk-PNZCLQDJ.js.map
@@ -1 +0,0 @@
1
- import{getLocalizedName,createLocalizedNameIndex}from"./chunk-M5IBENCW.js";var ship_manufacturer_names_default={SideWinder:{en:"Faulcon DeLacy"},Eagle:{en:"Core Dynamics"},Hauler:{en:"Zorgon Peterson"},Adder:{en:"Zorgon Peterson"},Viper:{en:"Faulcon DeLacy"},CobraMkIII:{en:"Faulcon DeLacy"},Type6:{en:"Lakon Spaceways"},Dolphin:{en:"Saud Kruger"},Type7:{en:"Lakon Spaceways"},Asp:{en:"Lakon Spaceways"},Vulture:{en:"Core Dynamics"},Empire_Trader:{en:"Gutamaya"},Federation_Dropship:{en:"Core Dynamics"},Orca:{en:"Saud Kruger"},Type9:{en:"Lakon Spaceways"},Python:{en:"Faulcon DeLacy"},BelugaLiner:{en:"Saud Kruger"},FerDeLance:{en:"Zorgon Peterson"},Anaconda:{en:"Faulcon DeLacy"},Federation_Corvette:{en:"Core Dynamics"},Cutter:{en:"Gutamaya"},DiamondBack:{en:"Lakon Spaceways"},Empire_Courier:{en:"Gutamaya"},DiamondBackXL:{en:"Lakon Spaceways"},Empire_Eagle:{en:"Gutamaya"},Federation_Dropship_MkII:{en:"Core Dynamics"},Federation_Gunship:{en:"Core Dynamics"},Viper_MkIV:{en:"Faulcon DeLacy"},CobraMkIV:{en:"Faulcon DeLacy"},Independant_Trader:{en:"Lakon Spaceways"},Asp_Scout:{en:"Lakon Spaceways"},Type9_Military:{en:"Lakon Spaceways"},Krait_MkII:{en:"Faulcon DeLacy"},TypeX:{en:"Lakon Spaceways"},TypeX_2:{en:"Lakon Spaceways"},TypeX_3:{en:"Lakon Spaceways"},Krait_Light:{en:"Faulcon DeLacy"},Mamba:{en:"Zorgon Peterson"},Python_NX:{en:"Faulcon DeLacy"},Type8:{en:"Lakon Spaceways"},Mandalay:{en:"Zorgon Peterson"},CobraMkV:{en:"Faulcon DeLacy"},Corsair:{en:"Gutamaya"},PantherMkII:{en:"Zorgon Peterson"},LakonMiner:{en:"Lakon Spaceways"},Explorer_NX:{en:"Zorgon Peterson"},SmallCombat01_NX:{en:"Core Dynamics"},MediumTransport01:{en:"Zorgon Peterson"}};var ship_names_default={SideWinder:{en:"Sidewinder",es:"Sidewinder",fr:"Sidewinder",ru:"Sidewinder","zh-CN":"Sidewinder",pt:"Sidewinder",ka:"Sidewinder"},Eagle:{en:"Eagle",es:"Eagle",fr:"Eagle",ru:"Eagle","zh-CN":"Eagle",pt:"Eagle",ka:"Eagle"},Hauler:{en:"Hauler",es:"Hauler",fr:"Hauler",ru:"Hauler","zh-CN":"Hauler",pt:"Hauler",ka:"Hauler"},Adder:{en:"Adder",es:"Adder",fr:"Adder",ru:"Adder","zh-CN":"Adder",pt:"Adder",ka:"Adder"},Viper:{en:"Viper Mk III",es:"Viper Mk III",fr:"Viper Mk III",ru:"Viper Mk III","zh-CN":"Viper Mk III",pt:"Viper Mk III",ka:"Viper Mk III"},CobraMkIII:{en:"Cobra Mk III",es:"Cobra Mk III",fr:"Cobra Mk III",ru:"Cobra Mk III","zh-CN":"Cobra Mk III",pt:"Cobra Mk III",ka:"Cobra Mk III"},Type6:{en:"Type-6 Transporter",es:"Type-6 Transporter",fr:"Type-6 Transporter",ru:"Type-6 Transporter","zh-CN":"Type-6 Transporter",pt:"Type-6 Transporter",ka:"Type-6 Transporter"},Dolphin:{en:"Dolphin",es:"Dolphin",fr:"Dolphin",ru:"Dolphin","zh-CN":"Dolphin",pt:"Dolphin",ka:"Dolphin"},Type7:{en:"Type-7 Transporter",es:"Type-7 Transporter",fr:"Type-7 Transporter",ru:"Type-7 Transporter","zh-CN":"Type-7 Transporter",pt:"Type-7 Transporter",ka:"Type-7 Transporter"},Asp:{en:"Asp Explorer",es:"Asp Explorer",fr:"Asp Explorer",ru:"Asp Explorer","zh-CN":"Asp Explorer",pt:"Asp Explorer",ka:"Asp Explorer"},Vulture:{en:"Vulture",es:"Vulture",fr:"Vulture",ru:"Vulture","zh-CN":"Vulture",pt:"Vulture",ka:"Vulture"},Empire_Trader:{en:"Imperial Clipper",es:"Imperial Clipper",fr:"Imperial Clipper",ru:"Imperial Clipper","zh-CN":"Imperial Clipper",pt:"Imperial Clipper",ka:"Imperial Clipper"},Federation_Dropship:{en:"Federal Dropship",es:"Federal Dropship",fr:"Federal Dropship",ru:"Federal Dropship","zh-CN":"Federal Dropship",pt:"Federal Dropship",ka:"Federal Dropship"},Orca:{en:"Orca",es:"Orca",fr:"Orca",ru:"Orca","zh-CN":"Orca",pt:"Orca",ka:"Orca"},Type9:{en:"Type-9 Heavy",es:"Type-9 Heavy",fr:"Type-9 Heavy",ru:"Type-9 Heavy","zh-CN":"Type-9 Heavy",pt:"Type-9 Heavy",ka:"Type-9 Heavy"},Python:{en:"Python",es:"Python",fr:"Python",ru:"Python","zh-CN":"Python",pt:"Python",ka:"Python"},BelugaLiner:{en:"Beluga Liner",es:"Beluga Liner",fr:"Beluga Liner",ru:"Beluga Liner","zh-CN":"Beluga Liner",pt:"Beluga Liner",ka:"Beluga Liner"},FerDeLance:{en:"Fer-de-Lance",es:"Fer-de-Lance",fr:"Fer-de-Lance",ru:"Fer-de-Lance","zh-CN":"Fer-de-Lance",pt:"Fer-de-Lance",ka:"Fer-de-Lance"},Anaconda:{en:"Anaconda",es:"Anaconda",fr:"Anaconda",ru:"Anaconda","zh-CN":"Anaconda",pt:"Anaconda",ka:"Anaconda"},Federation_Corvette:{en:"Federal Corvette",es:"Federal Corvette",fr:"Federal Corvette",ru:"Federal Corvette","zh-CN":"Federal Corvette",pt:"Federal Corvette",ka:"Federal Corvette"},Cutter:{en:"Imperial Cutter",es:"Imperial Cutter",fr:"Imperial Cutter",ru:"Imperial Cutter","zh-CN":"Imperial Cutter",pt:"Imperial Cutter",ka:"Imperial Cutter"},DiamondBack:{en:"Diamondback Scout",es:"Diamondback Scout",fr:"Diamondback Scout",ru:"Diamondback Scout","zh-CN":"Diamondback Scout",pt:"Diamondback Scout",ka:"Diamondback Scout"},Empire_Courier:{en:"Imperial Courier",es:"Imperial Courier",fr:"Imperial Courier",ru:"Imperial Courier","zh-CN":"Imperial Courier",pt:"Imperial Courier",ka:"Imperial Courier"},DiamondBackXL:{en:"Diamondback Explorer",es:"Diamondback Explorer",fr:"Diamondback Explorer",ru:"Diamondback Explorer","zh-CN":"Diamondback Explorer",pt:"Diamondback Explorer",ka:"Diamondback Explorer"},Empire_Eagle:{en:"Imperial Eagle",es:"Imperial Eagle",fr:"Imperial Eagle",ru:"Imperial Eagle","zh-CN":"Imperial Eagle",pt:"Imperial Eagle",ka:"Imperial Eagle"},Federation_Dropship_MkII:{en:"Federal Assault Ship",es:"Federal Assault Ship",fr:"Federal Assault Ship",ru:"Federal Assault Ship","zh-CN":"Federal Assault Ship",pt:"Federal Assault Ship",ka:"Federal Assault Ship"},Federation_Gunship:{en:"Federal Gunship",es:"Federal Gunship",fr:"Federal Gunship",ru:"Federal Gunship","zh-CN":"Federal Gunship",pt:"Federal Gunship",ka:"Federal Gunship"},Viper_MkIV:{en:"Viper Mk IV",es:"Viper Mk IV",fr:"Viper Mk IV",ru:"Viper Mk IV","zh-CN":"Viper Mk IV",pt:"Viper Mk IV",ka:"Viper Mk IV"},CobraMkIV:{en:"Cobra Mk IV",es:"Cobra Mk IV",fr:"Cobra Mk IV",ru:"Cobra Mk IV","zh-CN":"Cobra Mk IV",pt:"Cobra Mk IV",ka:"Cobra Mk IV"},Independant_Trader:{en:"Keelback",es:"Keelback",fr:"Keelback",ru:"Keelback","zh-CN":"Keelback",pt:"Keelback",ka:"Keelback"},Asp_Scout:{en:"Asp Scout",es:"Asp Scout",fr:"Asp Scout",ru:"Asp Scout","zh-CN":"Asp Scout",pt:"Asp Scout",ka:"Asp Scout"},Type9_Military:{en:"Type-10 Defender",es:"Type-10 Defender",fr:"Type-10 Defender",ru:"Type-10 Defender","zh-CN":"Type-10 Defender",pt:"Type-10 Defender",ka:"Type-10 Defender"},Krait_MkII:{en:"Krait Mk II",es:"Krait Mk II",fr:"Krait Mk II",ru:"Krait Mk II","zh-CN":"Krait Mk II",pt:"Krait Mk II",ka:"Krait Mk II"},TypeX:{en:"Alliance Chieftain",es:"Alliance Chieftain",fr:"Alliance Chieftain",ru:"Alliance Chieftain","zh-CN":"Alliance Chieftain",pt:"Alliance Chieftain",ka:"Alliance Chieftain"},TypeX_2:{en:"Alliance Crusader",es:"Alliance Crusader",fr:"Alliance Crusader",ru:"Alliance Crusader","zh-CN":"Alliance Crusader",pt:"Alliance Crusader",ka:"Alliance Crusader"},TypeX_3:{en:"Alliance Challenger",es:"Alliance Challenger",fr:"Alliance Challenger",ru:"Alliance Challenger","zh-CN":"Alliance Challenger",pt:"Alliance Challenger",ka:"Alliance Challenger"},Krait_Light:{en:"Krait Phantom",es:"Krait Phantom",fr:"Krait Phantom",ru:"Krait Phantom","zh-CN":"Krait Phantom",pt:"Krait Phantom",ka:"Krait Phantom"},Mamba:{en:"Mamba",es:"Mamba",fr:"Mamba",ru:"Mamba","zh-CN":"Mamba",pt:"Mamba",ka:"Mamba"},Python_NX:{en:"Python Mk II",es:"Python Mk II",fr:"Python Mk II",ru:"Python Mk II","zh-CN":"Python Mk II",ka:"Python Mk II"},Type8:{en:"Type-8 Transporter",es:"Type-8 Transporter",fr:"Type-8 Transporter",ru:"Type-8 Transporter","zh-CN":"Type-8 Transporter",ka:"Type-8 Transporter"},Mandalay:{en:"Mandalay",es:"Mandalay",fr:"Mandalay",ru:"Mandalay","zh-CN":"Mandalay",ka:"Mandalay"},CobraMkV:{en:"Cobra Mk V",es:"Cobra Mk V",fr:"Cobra Mk V",ru:"Cobra Mk V","zh-CN":"Cobra Mk V",ka:"Cobra Mk V"},Corsair:{en:"Corsair",es:"Corsair",fr:"Corsair",ru:"Corsair","zh-CN":"Corsair",ka:"Corsair"},PantherMkII:{en:"Panther Clipper Mk II",es:"Panther Clipper Mk II",fr:"Panther Clipper Mk II",ru:"Panther Clipper Mk II","zh-CN":"Panther Clipper Mk II",ka:"Panther Clipper Mk II"},LakonMiner:{en:"Type-11 Prospector",es:"Type-11 Prospector",ru:"Type-11 Prospector","zh-CN":"Type-11 Prospector",ka:"Type-11 Prospector"},Explorer_NX:{en:"Caspian Explorer",es:"Caspian Explorer",ru:"Caspian Explorer","zh-CN":"Caspian Explorer",ka:"Caspian Explorer"},SmallCombat01_NX:{en:"Kestrel Mk II",es:"Kestrel Mk II",ru:"Kestrel Mk II","zh-CN":"Kestrel Mk II",ka:"Kestrel Mk II"},MediumTransport01:{en:"Lynx Highliner",es:"Lynx Highliner",ru:"Lynx Highliner","zh-CN":"Lynx Highliner"}};var SHIP_NAMES=/* @__PURE__ */createLocalizedNameIndex(ship_names_default);var MANUFACTURER_NAMES=/* @__PURE__ */createLocalizedNameIndex(ship_manufacturer_names_default);function getShipName(symbol,locale){return getLocalizedName(SHIP_NAMES,symbol,locale,"getShipName","symbol")}function getShipManufacturer(symbol,locale){return getLocalizedName(MANUFACTURER_NAMES,symbol,locale,"getShipManufacturer","symbol")}export{getShipManufacturer,getShipName};//# sourceMappingURL=chunk-TFPIPIMU.js.map
@@ -1 +0,0 @@
1
- import{MANUFACTURED_MATERIALS}from"./chunk-HKXXFIRI.js";import{RAW_MATERIALS}from"./chunk-SQS7672E.js";import{ENCODED_MATERIALS}from"./chunk-Q5XOGATC.js";var ALL_MATERIALS=Object.freeze([...RAW_MATERIALS,...MANUFACTURED_MATERIALS,...ENCODED_MATERIALS]);export{ALL_MATERIALS};//# sourceMappingURL=chunk-TLA6LHLN.js.map
@@ -1 +0,0 @@
1
- import{shieldMetrics}from"./chunk-2FHHMYDC.js";import{getShipBySymbol,getShipByName,getShipSlots}from"./chunk-WNGQ3IAM.js";import{parseSlef,toSlef,stringifySlef,getLoadoutModifier}from"./chunk-UXFMVZAY.js";import{sourcePurchaseFromLoadout,getSourceModuleValue}from"./chunk-IYU4WLFM.js";import{weaponsCapacitorMetrics}from"./chunk-FMPRCYKY.js";import{powerBudget}from"./chunk-RLUS76LZ.js";import{isNonOutfittingSlot,isBuiltInHullModule,cloneLoadoutModule,identifyPreEngineeredVariant,cloneModuleStats,availableBlueprintsFor,availableExperimentalsFor,ownKeyIn,FITTED_ITEM,blueprintAvailableFor,blueprintRoutesFor,experimentalAvailableFor,primitiveEngineeringInputsFor,missingBaseLabels,journalModifiersFor,getPreEngineeredStats,getPreEngineeredJournalModifiers,getPreEngineeredModifiers,ordinaryEngineeringProof,unresolvedModifiers,orderBySlotLayout,matchingKeyIn,isCargoHatchSlot,isFinalGuardianWeaponEngineering,scaleDamageComponents}from"./chunk-77QR33ON.js";import{weaponMetrics,sumWeaponMetrics,combinedRateOfFire}from"./chunk-LJI7VXJD.js";import{builtInModuleBySymbol,getBulkheadsForShip}from"./chunk-QMFBL5XO.js";import{getPreEngineeredVariants}from"./chunk-MTAGULIO.js";import{shieldRecovery,cellBankSummary}from"./chunk-VZZUNSDF.js";import{calculateUnladenMass,calculateCargoCapacity,calculateFuelCapacity}from"./chunk-AFVYCQWL.js";import{fixedSlotReason,validateLoadout}from"./chunk-B4ZSTOM4.js";import{mobilityMetrics}from"./chunk-24INI4U7.js";import{calculateModuleLimits}from"./chunk-KPETDYQX.js";import{ALL_MODULES}from"./chunk-PNZCLQDJ.js";import{CORE_MODULES}from"./chunk-O72KI7RP.js";import{getExperimentalEffect}from"./chunk-PHPLZEFS.js";import{heatMetrics}from"./chunk-W6EPHHTS.js";import{singleJumpRange,frameShiftDriveMassFactor,fuelPerJump,totalRange}from"./chunk-GQ5GX5TB.js";import{ammunitionCapacity}from"./chunk-AA3K5XUE.js";import{armourMetrics}from"./chunk-FGXWVFN6.js";import{baseStats,computeModifiers,labelsForDamageType,scaleForLabel,fieldForLabel,labelsForField,capabilityValueForLabel,damageTypeForLabel}from"./chunk-DYPOL3CI.js";import{resolveBlueprintForModule}from"./chunk-2TW4ZBI3.js";import{getExperimentalsForModule}from"./chunk-QTZPA2FR.js";import{getBlueprintGrade}from"./chunk-QI22FKBG.js";import{getDefaultLoadout}from"./chunk-GRIK3EDH.js";import{distributorMetrics}from"./chunk-P2QOL63K.js";import{loadoutSlotName}from"./chunk-KAA4VOOB.js";import{parseSlotName,enumerateSlots,SLOT_RESTRICTION_LABELS}from"./chunk-RAO35XDF.js";import{normalizeKey}from"./chunk-BKWLI44T.js";import{truncate,describeValue,requireString,requireStringIfPresent}from"./chunk-PKWVG2JY.js";import{deepFreeze}from"./chunk-DURKO7JU.js";var NO_ISSUES=Object.freeze([]);function completeResult(value){return Object.freeze({value:value,complete:true,issues:NO_ISSUES})}function incompleteResult(issues){return Object.freeze({value:null,complete:false,issues:Object.freeze(issues.map(issue=>Object.freeze({...issue,...issue.params?{params:Object.freeze({...issue.params})}:{}})))})}var PREFIX={powerPlant:["int_powerplant","int_guardianpowerplant"],thrusters:["int_engine","int_mkiiagileboost_engine"],frameShiftDrive:["int_hyperdrive"],powerDistributor:["int_powerdistributor","int_guardianpowerdistributor"],shieldGenerator:["int_shieldgenerator"],shieldCellBank:["int_shieldcellbank"],shieldBooster:["hpt_shieldbooster"],shieldReinforcement:["int_guardianshieldreinforcement"],hullReinforcement:["int_hullreinforcement","int_guardianhullreinforcement","int_metaalloyhullreinforcement"],moduleReinforcement:["int_modulereinforcement","int_guardianmodulereinforcement"]};var startsWithAny=(symbol,prefixes)=>prefixes.some(prefix=>symbol.toLowerCase().startsWith(prefix));function isPowerDistributor(module,stats){return stats?.slot?stats.slot==="powerDistributor":startsWithAny(module.Item,PREFIX.powerDistributor)}function isPowerPlant(module,stats){const parsed=parseSlotName(module.Slot);if(parsed?.kind==="core"&&parsed.core==="powerPlant")return true;return stats?.slot?stats.slot==="powerPlant":startsWithAny(module.Item,PREFIX.powerPlant)}function isThruster(module,stats){const parsed=parseSlotName(module.Slot);if(parsed?.kind==="core"&&parsed.core==="thrusters")return true;return stats?.slot?stats.slot==="thrusters":startsWithAny(module.Item,PREFIX.thrusters)}function isFrameShiftDrive(module,stats){const parsed=parseSlotName(module.Slot);if(parsed?.kind==="core"&&parsed.core==="frameShiftDrive")return true;return stats?.slot?stats.slot==="frameShiftDrive":startsWithAny(module.Item,PREFIX.frameShiftDrive)}function isEnabled(module){return module.On!==false}function priorityOf(module){return(module.Priority??0)+1}function effectiveStat(module,field,stats){const stated=statedModifier(module,field);if(stated!==void 0)return stated;const base=stats?.[field];return typeof base==="number"?base:void 0}function statedModifier(module,field){for(const label of labelsForField(field)){if(capabilityValueForLabel(label)!==null)continue;const modified=getLoadoutModifier(module,label);if(modified!==null)return modified/scaleForLabel(label)}return void 0}function effectiveCapability(module,field,stats){for(const label of labelsForField(field)){if(capabilityValueForLabel(label)===null)continue;if(module.Engineering?.Modifiers?.some(modifier=>modifier.Label.toLowerCase()===label.toLowerCase())){return true}}const base=stats[field];return typeof base==="boolean"?base:void 0}function effectiveDamageDistribution(module,stats){const fromEffect=module.Engineering?.ExperimentalEffect?getExperimentalEffect(module.Engineering.ExperimentalEffect)?.damageDistribution:void 0;const distribution={...fromEffect??stats.damageDistribution};let resolved=fromEffect!==void 0||stats.damageDistribution!==void 0;const seen=/* @__PURE__ */new Set;for(const modifier of module.Engineering?.Modifiers??[]){const type=damageTypeForLabel(modifier.Label);if(type===null||seen.has(type))continue;seen.add(type);if(modifier.Value===void 0)continue;distribution[type]=modifier.Value/scaleForLabel(modifier.Label);resolved=true}return resolved?distribution:void 0}function convertsDamage(module){if(module.Engineering?.ExperimentalEffect&&getExperimentalEffect(module.Engineering.ExperimentalEffect)?.damageDistribution){return true}return(module.Engineering?.Modifiers??[]).some(modifier=>damageTypeForLabel(modifier.Label)!==null)}function modifierRatio(module,stats,field){const base=stats?.[field];if(typeof base!=="number"||base===0)return 1;const effective=effectiveStat(module,field,stats);return effective===void 0?1:effective/base}function relatedStat(module,stats,field,ratio){const stated=statedModifier(module,field);if(stated!==void 0)return stated;const base=stats?.[field];return typeof base==="number"?base*ratio:void 0}function effectiveModule(module,stats){if(!stats||!module.Engineering)return stats;const merged={...stats};const fields=new Set(Object.keys(stats));for(const modifier of module.Engineering.Modifiers??[]){const field=fieldForLabel(modifier.Label,stats);if(field)fields.add(field)}for(const key of fields){const capability=effectiveCapability(module,key,stats);if(capability!==void 0){merged[key]=capability;continue}const value=effectiveStat(module,key,stats);if(value!==void 0)merged[key]=value}if(stats.engineeringGroup==="thrusters"){const massRatio=modifierRatio(module,stats,"optMass");const minMass=relatedStat(module,stats,"minMass",massRatio);const maxMass=relatedStat(module,stats,"maxMass",massRatio);if(minMass!==void 0)merged.minMass=minMass;if(maxMass!==void 0)merged.maxMass=maxMass}if(stats.engineeringGroup==="thrusters"||stats.engineeringGroup==="shieldGenerators"){const performanceRatio=modifierRatio(module,stats,"optMultiplier");const minMultiplier=relatedStat(module,stats,"minMultiplier",performanceRatio);const maxMultiplier=relatedStat(module,stats,"maxMultiplier",performanceRatio);if(minMultiplier!==void 0)merged.minMultiplier=minMultiplier;if(maxMultiplier!==void 0)merged.maxMultiplier=maxMultiplier;if(stats.engineeringGroup==="thrusters"){for(const field of["minSpeedMultiplier","optSpeedMultiplier","maxSpeedMultiplier","minRotationMultiplier","optRotationMultiplier","maxRotationMultiplier"]){const value=stats[field];if(value!==void 0)merged[field]=value*performanceRatio}}}const damageDistribution=effectiveDamageDistribution(module,stats);if(damageDistribution)merged.damageDistribution=damageDistribution;if(stats.category==="hardpoint")normalizeEffectiveWeapon(module,merged);if(convertsDamage(module)){delete merged.damageComponents}else if(stats.damageComponents){merged.damageComponents=scaleDamageComponents(stats.damageComponents,stats.damage,typeof merged.damage==="number"?merged.damage:void 0)}return merged}function powerConsumerFor(module,stats){const draw=effectiveStat(module,"powerDraw",stats);if(draw===void 0||draw===0)return null;const mounted=stats?.category==="hardpoint"||stats?.category==="utility";return{draw:draw,priority:priorityOf(module),enabled:isEnabled(module),deployedOnly:mounted&&stats?.alwaysPowered!==true,label:module.Slot,symbol:module.Item}}function powerAvailable(modules,statsFor){for(const module of modules){const stats=statsFor(module);if(!isPowerPlant(module,stats))continue;if(!isEnabled(module))return 0;return effectiveStat(module,"powerCapacity",stats)??0}return 0}function metricIssue(field,reason,module){const defaultSlot=field==="powerCapacity"?"PowerPlant":field==="thrusters"?"MainEngines":void 0;const slot=module?.Slot??defaultSlot;const symbol=module?.Item;const params={field:field,reason:reason,...slot===void 0?{}:{slot:slot},...symbol===void 0?{}:{symbol:symbol}};let message;if(reason==="missing"){message=field==="powerCapacity"?"PowerPlant: no power plant is fitted":field==="thrusters"?"MainEngines: no thrusters are fitted":"no shield generator is fitted"}else if(reason==="unresolved"){const unavailable=field==="thrusters"?"thruster stats":field==="shieldGenerator"?"shield-generator stats":field==="powerCapacity"?"power capacity":field;message=`${truncate(slot??field)}: ${unavailable} unavailable for ${truncate(symbol??field)}`}else if(reason==="disabled"){message=`${truncate(slot??field)}: ${truncate(symbol??field)} is switched off`}else if(reason==="invalid"){message=`${truncate(slot??field)}: ${truncate(symbol??field)} has invalid ${field}`}else{message=`${truncate(slot??field)}: ${truncate(symbol??field)} is not powered with hardpoints retracted`}return{field:field,reason:reason,...slot===void 0?{}:{slot:slot},...symbol===void 0?{}:{symbol:symbol},message:message,params:params}}function powerPlantIssueFor(modules,statsFor){for(const module of modules){const stats=statsFor(module);if(!isPowerPlant(module,stats))continue;if(!isEnabled(module))return metricIssue("powerCapacity","disabled",module);const capacity=effectiveStat(module,"powerCapacity",stats);if(capacity===void 0)return metricIssue("powerCapacity","unresolved",module);return!Number.isFinite(capacity)||capacity<=0?metricIssue("powerCapacity","invalid",module):null}return metricIssue("powerCapacity","missing")}function powerDrawIssueFor(modules,statsFor){for(const module of modules){const consumer=powerConsumerFor(module,statsFor(module));if(consumer&&(!Number.isFinite(consumer.draw)||consumer.draw<0)){return metricIssue("powerDraw","invalid",module)}}return null}function poweredMetricBudgetFor(field,module,stats,modules,getBudget,statsFor){if(!isEnabled(module))return incompleteResult([metricIssue(field,"disabled",module)]);const plantIssue=powerPlantIssueFor(modules,statsFor);if(plantIssue)return incompleteResult([plantIssue]);const drawIssue=powerDrawIssueFor(modules,statsFor);if(drawIssue)return incompleteResult([drawIssue]);const budget=getBudget();return budget.available>0&&poweredStates(module,stats,budget).retracted?completeResult(budget):incompleteResult([metricIssue(field,"shed",module)])}function poweredShieldGeneratorResultFor(modules,getBudget,statsFor){for(const module of modules){if(!startsWithAny(module.Item,PREFIX.shieldGenerator))continue;const stats=statsFor(module);const powered=poweredMetricBudgetFor("shieldGenerator",module,stats,modules,getBudget,statsFor);if(!powered.complete)return powered;return stats===null?incompleteResult([metricIssue("shieldGenerator","unresolved",module)]):completeResult({module:module,budget:powered.value})}return incompleteResult([metricIssue("shieldGenerator","missing")])}function mapResistanceFields(read){return{kineticResistance:read("kineticResistance")??0,thermalResistance:read("thermalResistance")??0,explosiveResistance:read("explosiveResistance")??0,causticResistance:read("causticResistance")??0}}function resistancesOf(module,stats){return mapResistanceFields(field=>effectiveStat(module,field,stats))}function shieldInputFor(ship,modules,budget,systemsPips,statsFor){let generator=null;const boosters=[];let reinforcement=0;for(const module of modules){if(!isEnabled(module))continue;const stats=statsFor(module);if(!(budget.available>0&&poweredStates(module,stats,budget).retracted))continue;if(!generator&&startsWithAny(module.Item,PREFIX.shieldGenerator)){const massRatio=modifierRatio(module,stats,"optMass");const strengthRatio=modifierRatio(module,stats,"optMultiplier");const optMass=effectiveStat(module,"optMass",stats);const minMass=relatedStat(module,stats,"minMass",massRatio);const maxMass=relatedStat(module,stats,"maxMass",Math.max(1,massRatio));const optMultiplier=effectiveStat(module,"optMultiplier",stats);const minMultiplier=relatedStat(module,stats,"minMultiplier",strengthRatio);const maxMultiplier=relatedStat(module,stats,"maxMultiplier",strengthRatio);generator={...optMass===void 0?{}:{optMass:optMass},...minMass===void 0?{}:{minMass:minMass},...maxMass===void 0?{}:{maxMass:maxMass},...optMultiplier===void 0?{}:{optMultiplier:optMultiplier},...minMultiplier===void 0?{}:{minMultiplier:minMultiplier},...maxMultiplier===void 0?{}:{maxMultiplier:maxMultiplier},...resistancesOf(module,stats)}}else if(startsWithAny(module.Item,PREFIX.shieldBooster)){boosters.push({shieldBoost:effectiveStat(module,"shieldBoost",stats)??0,...resistancesOf(module,stats)})}else if(startsWithAny(module.Item,PREFIX.shieldReinforcement)){reinforcement+=effectiveStat(module,"shieldAddition",stats)??0}}return{hullMass:ship.hullMass,baseShieldStrength:ship.baseShieldStrength,generator:generator,boosters:boosters,reinforcement:reinforcement,systemsPips:systemsPips}}function shieldInputResultFor(ship,modules,getBudget,systemsPips,statsFor){const fitted=poweredShieldGeneratorResultFor(modules,getBudget,statsFor);if(!fitted.complete)return fitted;const input=shieldInputFor(ship,modules,fitted.value.budget,systemsPips,statsFor);return completeResult(input)}function mobilityInputResultFor(ship,modules,getBudget,mass,enginesPips,statsFor){let thrusters=null;for(const module of modules){const stats=statsFor(module);if(!isThruster(module,stats))continue;const powered=poweredMetricBudgetFor("thrusters",module,stats,modules,getBudget,statsFor);if(!powered.complete)return powered;const effective=effectiveModule(module,stats);const minMass=effective?.minMass;const optMass=effective?.optMass;const maxMass=effective?.maxMass;const minMultiplier=effective?.minMultiplier;const optMultiplier=effective?.optMultiplier;const maxMultiplier=effective?.maxMultiplier;if(minMass===void 0||optMass===void 0||maxMass===void 0||minMultiplier===void 0||optMultiplier===void 0||maxMultiplier===void 0){return incompleteResult([metricIssue("thrusters","unresolved",module)])}thrusters={minMass:minMass,optMass:optMass,maxMass:maxMass,minMultiplier:minMultiplier,optMultiplier:optMultiplier,maxMultiplier:maxMultiplier,...effective?.optSpeedMultiplier===void 0?{}:{speedCurve:{minMass:minMass,optMass:optMass,maxMass:maxMass,minMultiplier:effective.minSpeedMultiplier??minMultiplier,optMultiplier:effective.optSpeedMultiplier,maxMultiplier:effective.maxSpeedMultiplier??maxMultiplier}},...effective?.optRotationMultiplier===void 0?{}:{rotationCurve:{minMass:minMass,optMass:optMass,maxMass:maxMass,minMultiplier:effective.minRotationMultiplier??minMultiplier,optMultiplier:effective.optRotationMultiplier,maxMultiplier:effective.maxRotationMultiplier??maxMultiplier}}};break}if(!thrusters)return incompleteResult([metricIssue("thrusters","missing")]);return completeResult({minimumSpeed:ship.minimumSpeed,maximumSpeed:ship.maximumSpeed,boost:ship.boost,minPitch:ship.minPitch,pitch:ship.pitch,minRoll:ship.minRoll,roll:ship.roll,minYaw:ship.minYaw,yaw:ship.yaw,mass:typeof mass==="function"?mass():mass,thrusters:thrusters,enginesPips:enginesPips})}function shieldRecoveryInputResultFor(ship,modules,getBudget,systemsPips,statsFor){const generator=poweredShieldGeneratorResultFor(modules,getBudget,statsFor);if(!generator.complete)return generator;const{module:generatorModule,budget:budget}=generator.value;let distributor=null;for(const module of modules){const stats=statsFor(module);if(isPowerDistributor(module,stats)&&isEnabled(module)&&budget.available>0&&poweredStates(module,stats,budget).retracted)distributor=module}const generatorStats=statsFor(generatorModule);const distributorStats=distributor?statsFor(distributor):null;const strength=shieldMetrics(shieldInputFor(ship,modules,budget,0,statsFor)).strength;return completeResult({strength:strength,regenRate:effectiveStat(generatorModule,"shieldRegenRate",generatorStats)??0,brokenRegenRate:effectiveStat(generatorModule,"shieldBrokenRegenRate",generatorStats)??0,distributorDraw:effectiveStat(generatorModule,"distributorDraw",generatorStats)??.6,systemsCapacity:distributor?effectiveStat(distributor,"systemsCapacity",distributorStats)??0:0,systemsRecharge:distributor?effectiveStat(distributor,"systemsRecharge",distributorStats)??0:0,systemsPips:systemsPips})}function weaponsCapacitorInputFor(modules,weaponsPips,budget,statsFor){let weaponsCapacity=0;let weaponsRecharge=0;let sustainedEnergyPerSecond=0;for(const module of modules){if(!isEnabled(module))continue;const stats=statsFor(module);if(!poweredStates(module,stats,budget).deployed)continue;if(isPowerDistributor(module,stats)){weaponsCapacity=effectiveStat(module,"weaponsCapacity",stats)??0;weaponsRecharge=effectiveStat(module,"weaponsRecharge",stats)??0}const weapon=weaponStatsFor(module,stats);if(weapon){sustainedEnergyPerSecond+=weaponMetrics(weapon).sustainedEnergyPerSecond}}return{weaponsCapacity:weaponsCapacity,weaponsRecharge:weaponsRecharge,sustainedEnergyPerSecond:sustainedEnergyPerSecond,weaponsPips:weaponsPips}}function distributorInputFor(modules,pips,budget,statsFor){for(const module of modules){if(!isEnabled(module))continue;const stats=statsFor(module);if(!isPowerDistributor(module,stats))continue;if(!poweredStates(module,stats,budget).retracted)return null;const systemsCapacity=effectiveStat(module,"systemsCapacity",stats);const systemsRecharge=effectiveStat(module,"systemsRecharge",stats);const enginesCapacity=effectiveStat(module,"enginesCapacity",stats);const enginesRecharge=effectiveStat(module,"enginesRecharge",stats);const weaponsCapacity=effectiveStat(module,"weaponsCapacity",stats);const weaponsRecharge=effectiveStat(module,"weaponsRecharge",stats);if(systemsCapacity===void 0||systemsRecharge===void 0||enginesCapacity===void 0||enginesRecharge===void 0||weaponsCapacity===void 0||weaponsRecharge===void 0){return null}return{systemsCapacity:systemsCapacity,systemsRecharge:systemsRecharge,enginesCapacity:enginesCapacity,enginesRecharge:enginesRecharge,weaponsCapacity:weaponsCapacity,weaponsRecharge:weaponsRecharge,...pips}}return null}function heatInputFor(ship,modules,budget,statsFor){let heatEfficiency;let thrusterHeatRate=0;let deployedThrusterHeatRate=0;let fsdHeatRate=0;let weaponsCapacity=0;const weapons=[];for(const module of modules){const stats=statsFor(module);if(isPowerPlant(module,stats)){if(!isEnabled(module))return null;heatEfficiency=effectiveStat(module,"heatEfficiency",stats);continue}if(!isEnabled(module))continue;const running=poweredStates(module,stats,budget);if(isThruster(module,stats)){const heat=effectiveStat(module,"engineHeatRate",stats)??0;if(running.retracted)thrusterHeatRate+=heat;if(running.deployed)deployedThrusterHeatRate+=heat}else if(isFrameShiftDrive(module,stats)){if(running.retracted)fsdHeatRate+=effectiveStat(module,"fsdHeatRate",stats)??0}else if(isPowerDistributor(module,stats)){if(running.deployed){weaponsCapacity=effectiveStat(module,"weaponsCapacity",stats)??0}}const weapon=weaponStatsFor(module,stats);if(!running.deployed)continue;if(!weapon)continue;weapons.push({heatPerSecond:weaponMetrics(weapon).sustainedHeatPerSecond,distributorDraw:weapon.distributorDraw??0})}if(heatEfficiency===void 0)return null;return{heatCapacity:ship.heatCapacity,heatDissipation:ship.heatDissipation,heatEfficiency:heatEfficiency,retractedPowerDraw:poweredDraw(budget,"retracted"),deployedPowerDraw:poweredDraw(budget,"deployed"),thrusterHeatRate:thrusterHeatRate,deployedThrusterHeatRate:deployedThrusterHeatRate,fsdHeatRate:fsdHeatRate,weaponsCapacity:weaponsCapacity,weapons:weapons}}function poweredDraw(budget,state){const powered=state==="retracted"?"poweredRetracted":"poweredDeployed";return budget.bands.reduce((total,band)=>band[powered]?total+band[state]:total,0)}function poweredStates(module,stats,budget){const draw=effectiveStat(module,"powerDraw",stats);if(draw===void 0||draw===0)return{retracted:true,deployed:true};const band=budget.bands[Math.min(budget.bands.length,Math.max(1,priorityOf(module)))-1];if(!band)return{retracted:true,deployed:true};return{retracted:band.poweredRetracted,deployed:band.poweredDeployed}}function cellBankInputsFor(modules,budget,statsFor){const banks=[];for(const module of modules){if(!startsWithAny(module.Item,PREFIX.shieldCellBank))continue;const stats=statsFor(module);const effective=effectiveModule(module,stats);const ammunition=effective?ammunitionCapacity(effective):null;banks.push({slot:module.Slot,symbol:module.Item,reinforcementRate:effective?.shieldBankReinforcement??0,cells:ammunition?.total??0,spinUp:effective?.shieldBankSpinUp??0,duration:effective?.shieldBankDuration??0,heat:effective?.shieldBankHeat??0,powered:budget.available>0&&isEnabled(module)&&poweredStates(module,stats,budget).deployed})}return banks}function stockBulkhead(ship){const variants=getBulkheadsForShip(ship.name,CORE_MODULES);return variants.find(v=>v.symbol.toLowerCase().endsWith("_default"))??variants.find(v=>v.mass===0)??variants[0]??null}function armourInputFor(ship,modules,statsFor){const reinforcements=[];const moduleReinforcements=[];let bulkhead=null;for(const module of modules){if(!isEnabled(module))continue;const stats=statsFor(module);if(module.Slot.toLowerCase()==="armour"){bulkhead={hullBoost:effectiveStat(module,"hullBoost",stats)??0,...resistancesOf(module,stats)}}else if(startsWithAny(module.Item,PREFIX.hullReinforcement)){const boost=getLoadoutModifier(module,"DefenceModifierHealthMultiplier");reinforcements.push({hullReinforcement:effectiveStat(module,"hullReinforcement",stats)??0,hullBoost:boost===null?0:boost/scaleForLabel("DefenceModifierHealthMultiplier"),...resistancesOf(module,stats)})}else if(startsWithAny(module.Item,PREFIX.moduleReinforcement)){moduleReinforcements.push({moduleProtection:effectiveStat(module,"moduleProtection",stats)??0,integrity:effectiveStat(module,"integrity",stats)??0})}}if(!bulkhead){const stock=stockBulkhead(ship);bulkhead=stock?{hullBoost:stock.hullBoost??0,...mapResistanceFields(field=>stock[field])}:null}return{baseArmour:ship.baseArmour,bulkhead:bulkhead,reinforcements:reinforcements,moduleReinforcements:moduleReinforcements}}var WEAPON_FIELDS=["damage","roundsPerShot","rateOfFire","burstInterval","burstRounds","burstRateOfFire","chargeTime","clipSize","ammoMaximum","reloadTime","distributorDraw","thermalLoad","powerDraw","maximumRange","falloffRange","armourPiercing"];function weaponStatsFor(module,stats){if(!stats||stats.category!=="hardpoint")return null;const weapon={};for(const field of WEAPON_FIELDS){const value=effectiveStat(module,field,stats);if(value!==void 0)weapon[field]=value}normalizeEffectiveWeapon(module,weapon);const damageDistribution=effectiveDamageDistribution(module,stats);if(damageDistribution)weapon.damageDistribution=damageDistribution;if(stats.damageComponents&&!convertsDamage(module)){weapon.damageComponents=scaleDamageComponents(stats.damageComponents,stats.damage,typeof weapon.damage==="number"?weapon.damage:void 0)}if(stats.projectileRange)weapon.projectileRange={...stats.projectileRange};return weapon}function burstAdjustedRateOfFire(module,weapon){if(getLoadoutModifier(module,"RateOfFire")!==null)return void 0;const touched=["BurstSize","BurstRateOfFire","BurstInterval"].some(label=>getLoadoutModifier(module,label)!==null);if(!touched)return void 0;return combinedRateOfFire(weapon)}function normalizeEffectiveWeapon(module,weapon){const rate=burstAdjustedRateOfFire(module,weapon);if(rate!==void 0)weapon.rateOfFire=rate;const statedDamagePerSecond=getLoadoutModifier(module,"DamagePerSecond");const firingFactor=Number(weapon.roundsPerShot??1)*Number(weapon.rateOfFire??1);if(statedDamagePerSecond!==null&&firingFactor>0){weapon.damage=statedDamagePerSecond/firingFactor}const{maximumRange:maximumRange,falloffRange:falloffRange}=weapon;if(maximumRange!==void 0&&falloffRange!==void 0&&falloffRange>maximumRange){weapon.falloffRange=maximumRange}}var MILITARY_PREFIXES=["int_hullreinforcement","int_metaalloyhullreinforcement","int_modulereinforcement","int_shieldcellbank","int_guardianhullreinforcement","int_guardianmodulereinforcement","int_guardianshieldreinforcement"];var MINING_PREFIXES=["hpt_mininglaser","hpt_mining_abrblstr","hpt_mining_seismchrgwarhd","hpt_mining_subsurfdispmisle","hpt_human_extraction","hpt_miningtoolv2"];var CARGO_PREFIXES=["int_cargorack","int_largecargorack","int_corrosionproofcargorack","int_fueltank"];var RESTRICTED_SLOT_PREFIXES={mining:MINING_PREFIXES,military:MILITARY_PREFIXES,cargo:CARGO_PREFIXES,limpetController:["int_dronecontrol","int_multidronecontrol"],vesselHangar:["int_fighterbay"],passenger:["int_passengercabin","int_mkii_passengercabin"],planetaryApproachSuite:["int_planetapproachsuite"]};var problem=(constraint,message,params)=>({constraint:constraint,message:message,...params===void 0?{}:{params:params}});function restrictionProblem(slot,symbol){const restriction=slot.restriction;if(!restriction)return null;if(RESTRICTED_SLOT_PREFIXES[restriction].some(prefix=>symbol.startsWith(prefix))){return null}return problem("restrictedMount",`slot only takes ${SLOT_RESTRICTION_LABELS[restriction]}`,{restriction:restriction})}function moduleSlotProblem(slot,module){const required=module.restrictedToSlot;if(!required||slot.restriction===required)return null;return problem("restrictedMount",`module only fits a mount that takes ${SLOT_RESTRICTION_LABELS[required]}`,{restriction:required})}function moduleFitProblem(shipSymbol,slot,module){if(slot.kind==="cargoHatch"){return problem("immutableSlot","the cargoHatch slot cannot be changed")}if(slot.kind==="armour"){const hull=getShipBySymbol(shipSymbol);if(module.slot!=="armour"||module.ship===void 0){return problem("armourRequired","not a ship armour module")}if(!hull||module.ship.toLowerCase()!==hull.name.toLowerCase()){const armourHull=getShipByName(module.ship);return problem("wrongHullArmour",`armour belongs to ${truncate(module.ship)}, not ${truncate(hull?.name??shipSymbol)}`,{armourShipName:module.ship,...armourHull===null?{}:{armourShipSymbol:armourHull.symbol},shipSymbol:shipSymbol,...hull===null?{}:{shipName:hull.name}})}return null}const restricted=module.restrictedToShips;if(restricted&&!restricted.some(symbol2=>symbol2.toLowerCase()===shipSymbol.toLowerCase())){const allowedShipNames=restricted.map(symbol2=>{const hull=getShipBySymbol(symbol2);return hull?.name??symbol2});const labels=restricted.map((symbol2,index)=>{const name=allowedShipNames[index];return name===symbol2?symbol2:`${name} (${symbol2})`});return problem("restrictedHull",`module is restricted to ${truncate(labels.join(", "))}`,{allowedShipNames:allowedShipNames,allowedShipSymbols:[...restricted],shipSymbol:shipSymbol})}const wrongMount=moduleSlotProblem(slot,module);if(wrongMount)return wrongMount;const symbol=module.symbol.toLowerCase();const moduleSlot=module.slot;switch(slot.kind){case"core":if(moduleSlot!==slot.core){return problem("wrongCoreType",`not a ${slot.core} module`,{requiredCore:slot.core,moduleSlot:moduleSlot??"none"})}break;case"hardpoint":{if(module.category!=="hardpoint"){return problem("hardpointRequired","not a hardpoint weapon")}const restricted2=restrictionProblem(slot,symbol);if(restricted2)return restricted2;break}case"utility":if(module.category!=="utility"){return problem("utilityRequired","not a utility module")}return null;case"optional":{const isFuelTank=moduleSlot==="fuelTank";if(module.category!=="internal"&&!isFuelTank){return problem("optionalInternalRequired","not an optional-internal module")}if(moduleSlot&&!isFuelTank){return problem("coreModuleInOptionalSlot","a core module only fits its core slot")}const restricted2=restrictionProblem(slot,symbol);if(restricted2)return restricted2;break}}return module.class>slot.size?problem("oversized",`module size ${truncate(module.class)} exceeds slot size ${slot.size}`,{moduleClass:module.class,slotSize:slot.size}):null}function moduleFitError(shipSymbol,slot,module){return moduleFitProblem(shipSymbol,slot,module)?.message??null}var REBUY_FRACTION=.05;function exportLoadoutEvent(input,options){const fromSource=options.credits==="source";const source=fromSource?input.sourcePurchase:null;const totals=source!==null&&!input.sourceTotalsVoided&&sourceTotalsHold(input.modules,source)?source:null;const hullValue=fromSource?source?.hullValue??null:input.retailHullValue;const modulesValue=fromSource?totals?.modulesValue??null:computedModulesValue(input.modules,input.statsFor);const rebuy=fromSource?totals?.rebuy??null:hullValue===null||modulesValue===null?null:Math.trunc((hullValue+modulesValue)*REBUY_FRACTION);return{event:"Loadout",Ship:input.shipSymbol.toLowerCase(),...input.shipName===void 0?{}:{ShipName:input.shipName},...input.shipIdent===void 0?{}:{ShipIdent:input.shipIdent},...hullValue===null?{}:{HullValue:hullValue},...modulesValue===null?{}:{ModulesValue:modulesValue},UnladenMass:input.unladenMass,CargoCapacity:input.cargoCapacity,...input.maxJumpRange===null?{}:{MaxJumpRange:input.maxJumpRange},FuelCapacity:{Main:input.fuelCapacity.main,Reserve:input.fuelCapacity.reserve},...rebuy===null?{}:{Rebuy:rebuy},Modules:exportModules(input,options,fromSource)}}function exportModules(input,options,fromSource){const ordered=options.moduleOrder==="slots"?slotOrderedModules(input.modules,input.layout):[...input.modules.values()];return ordered.map(module=>{const on=module.On??(options.explicitPower?true:void 0);const priority=module.Priority??(options.explicitPower?0:void 0);const value=fromSource?sourceModuleValue(module,input.sourcePurchase):moduleValue(module,input.statsFor);return{Slot:module.Slot,Item:module.Item.toLowerCase(),...on===void 0?{}:{On:on},...priority===void 0?{}:{Priority:priority},...module.Health===void 0?{}:{Health:module.Health},...typeof value==="number"?{Value:value}:{},...module.Engineering===void 0?{}:{Engineering:cloneLoadoutModule(module).Engineering}}})}function slotOrderedModules(modules,layout){return orderBySlotLayout([...modules.values()],layout,module=>module.Slot)}function computedModulesValue(modules,statsFor){let sum=0;for(const module of modules.values()){const value=moduleValue(module,statsFor);if(value==="unknown")return null;if(value!=="free")sum+=value}return sum}function moduleValue(module,statsFor){const stats=statsFor(module);if(stats!==null)return stats.cost??"unknown";return isNonOutfittingSlot(module.Slot)||isBuiltInHullModule(module)?"free":"unknown"}var SOURCE_ITEM="ShipLoadout: sourcePurchase moduleValues[].item";function sourceModuleValue(module,source){const entry=source===null?null:getSourceModuleValue(source,module.Slot);if(entry===null)return"unknown";return normalizeKey(entry.item,SOURCE_ITEM)===normalizeKey(module.Item,FITTED_ITEM)?entry.value:"unknown"}function sourceTotalsHold(modules,source){for(const entry of source.moduleValues){const key=matchingKeyIn(modules,entry.slot);const fitted=key===null?void 0:modules.get(key);if(!fitted)return false;if(isCargoHatchSlot(entry.slot)&&entry.value===0)continue;if(normalizeKey(fitted.Item,FITTED_ITEM)!==normalizeKey(entry.item,SOURCE_ITEM)){return false}}return true}function captureLoadoutEvent(event){const modules=event.Modules;const shipName=event.ShipName;const shipIdent=event.ShipIdent;const hullValue=event.HullValue;const modulesValue=event.ModulesValue;const rebuy=event.Rebuy;const unladenMass=event.UnladenMass;const cargoCapacity=event.CargoCapacity;const fuelCapacity=event.FuelCapacity;return{Ship:event.Ship,Modules:Array.isArray(modules)?captureEach(modules,captureModule):modules,...shipName===void 0?{}:{ShipName:shipName},...shipIdent===void 0?{}:{ShipIdent:shipIdent},...hullValue===void 0?{}:{HullValue:hullValue},...modulesValue===void 0?{}:{ModulesValue:modulesValue},...rebuy===void 0?{}:{Rebuy:rebuy},...unladenMass===void 0?{}:{UnladenMass:unladenMass},...cargoCapacity===void 0?{}:{CargoCapacity:cargoCapacity},...fuelCapacity===void 0?{}:{FuelCapacity:{...fuelCapacity}}}}function captureEach(values,capture){const captured=[];const{length:length}=values;for(let index=0;index<length;index++)captured.push(capture(values[index]));return captured}function captureModule(module){if(module===null||typeof module!=="object")return module;const on=module.On;const priority=module.Priority;const health=module.Health;const value=module.Value;const engineering=module.Engineering;return{Slot:module.Slot,Item:module.Item,...on===void 0?{}:{On:on},...priority===void 0?{}:{Priority:priority},...health===void 0?{}:{Health:health},...value===void 0?{}:{Value:value},...engineering===void 0?{}:{Engineering:captureEngineering(engineering)}}}function captureEngineering(engineering){if(engineering===null||typeof engineering!=="object")return engineering;const experimental=engineering.ExperimentalEffect;const experimentalLocalised=engineering.ExperimentalEffect_Localised;const modifiers=engineering.Modifiers;return{BlueprintName:engineering.BlueprintName,Level:engineering.Level,Quality:engineering.Quality,...experimental===void 0?{}:{ExperimentalEffect:experimental},...experimentalLocalised===void 0?{}:{ExperimentalEffect_Localised:experimentalLocalised},...modifiers===void 0?{}:{Modifiers:Array.isArray(modifiers)?captureEach(modifiers,modifier=>modifier!==null&&typeof modifier==="object"?{...modifier}:modifier):modifiers}}}function hullLayout(shipSymbol){const slots=getShipSlots(shipSymbol);return slots?enumerateSlots(slots):[]}function fixedMountRejects(shipSymbol,layout,slot,stats){const mount=layout.find(candidate=>candidate.key.toLowerCase()===slot.toLowerCase());return mount!==void 0&&moduleFitProblem(shipSymbol,mount,stats)!==null}function normalizeLoadoutEvent(rawEvent){const event=captureLoadoutEvent(rawEvent);requireString(event.Ship,"ShipLoadout.fromLoadout: event.Ship");if(!Array.isArray(event.Modules)){throw new TypeError(`ShipLoadout.fromLoadout: event.Modules must be an array, received ${describeValue(event.Modules)}`)}const modules=/* @__PURE__ */new Map;const slots=/* @__PURE__ */new Set;for(const module of event.Modules){if(module===null||typeof module!=="object"){throw new TypeError(`ShipLoadout.fromLoadout: event.Modules[] must hold module objects, received ${describeValue(module)}`)}requireString(module.Slot,"ShipLoadout.fromLoadout: module.Slot");requireString(module.Item,"ShipLoadout.fromLoadout: module.Item");if(module.Engineering!==void 0){if(module.Engineering===null||typeof module.Engineering!=="object"){throw new TypeError(`ShipLoadout.fromLoadout: module.Engineering must be an object, received ${describeValue(module.Engineering)}`)}requireStringIfPresent(module.Engineering.BlueprintName,"ShipLoadout.fromLoadout: module.Engineering.BlueprintName");requireStringIfPresent(module.Engineering.ExperimentalEffect,"ShipLoadout.fromLoadout: module.Engineering.ExperimentalEffect");if(module.Engineering.Modifiers!==void 0&&!Array.isArray(module.Engineering.Modifiers)){throw new TypeError(`ShipLoadout.fromLoadout: module.Engineering.Modifiers must be an array, received ${describeValue(module.Engineering.Modifiers)}`)}for(const[index,modifier]of(module.Engineering.Modifiers??[]).entries()){if(modifier===null||typeof modifier!=="object"){throw new TypeError(`ShipLoadout.fromLoadout: module.Engineering.Modifiers[${index}] must be an object, received ${describeValue(modifier)}`)}requireString(modifier.Label,`ShipLoadout.fromLoadout: module.Engineering.Modifiers[${index}].Label`)}}const normalizedSlot=module.Slot.toLowerCase();if(slots.has(normalizedSlot)){throw new TypeError(`ShipLoadout.fromLoadout: duplicate slot "${truncate(module.Slot)}"`)}slots.add(normalizedSlot);modules.set(module.Slot,cloneLoadoutModule(module))}const top={};if(event.ShipName!==void 0)top.ShipName=event.ShipName;if(event.ShipIdent!==void 0)top.ShipIdent=event.ShipIdent;if(event.HullValue!==void 0)top.HullValue=event.HullValue;if(event.ModulesValue!==void 0)top.ModulesValue=event.ModulesValue;if(event.Rebuy!==void 0)top.Rebuy=event.Rebuy;if(event.UnladenMass!==void 0)top.UnladenMass=event.UnladenMass;if(event.CargoCapacity!==void 0)top.CargoCapacity=event.CargoCapacity;if(event.FuelCapacity!==void 0)top.FuelCapacity={...event.FuelCapacity};let invalidatesAggregates=false;const outcomes=[];const defaults=getDefaultLoadout(event.Ship)?.modules??[];let layout;for(const[slot,module]of modules){if(isNonOutfittingSlot(slot)||isBuiltInHullModule(module))continue;const stats=builtInModuleBySymbol(module.Item,"ShipLoadout.fromLoadout: module.Item");const slotKind=parseSlotName(slot)?.kind;const fallback=slotKind==="core"||slotKind==="armour"||slotKind==="cargoHatch"?defaults.find(candidate=>candidate.slot.toLowerCase()===slot.toLowerCase()):void 0;const rejected=fallback!==void 0&&(stats===null||slotKind==="cargoHatch"||fixedMountRejects(event.Ship,layout??=hullLayout(event.Ship),slot,stats));if(stats!==null&&!rejected)continue;if(fallback){modules.set(slot,{Slot:slot,Item:fallback.symbol,...module.On===void 0?{}:{On:module.On},...module.Priority===void 0?{}:{Priority:module.Priority},...module.Health===void 0?{}:{Health:module.Health}});outcomes.push({action:"defaulted",slot:slot,sourceSymbol:module.Item,replacementSymbol:fallback.symbol})}else{modules.delete(slot);outcomes.push({action:"emptied",slot:slot,sourceSymbol:module.Item})}invalidatesAggregates=true}for(const fallback of defaults){const slotKind=parseSlotName(fallback.slot)?.kind;if(slotKind!=="core"&&slotKind!=="armour"&&slotKind!=="cargoHatch"||matchingKeyIn(modules,fallback.slot)!==null){continue}const slot=ownKeyIn(modules,fallback.slot);modules.set(slot,{Slot:slot,Item:fallback.symbol});outcomes.push({action:"defaulted",slot:slot,sourceSymbol:null,replacementSymbol:fallback.symbol});if(slotKind==="core")invalidatesAggregates=true}if(invalidatesAggregates){delete top.ModulesValue;delete top.Rebuy;delete top.UnladenMass;delete top.CargoCapacity;delete top.FuelCapacity}const moduleStats=/* @__PURE__ */new Map;const primitiveModifiers=/* @__PURE__ */new Map;for(const module of modules.values()){const engineering=module.Engineering;const variant=identifyPreEngineeredVariant(module);const catalogueVariantStats=variant?getPreEngineeredStats(variant):null;let variantStats=catalogueVariantStats;const retainsBakedExperimental=variant?.experimental!==void 0&&typeof engineering?.ExperimentalEffect==="string"&&variant.experimental.trim().toLowerCase()===engineering.ExperimentalEffect.trim().toLowerCase();if(variant&&catalogueVariantStats&&!catalogueVariantStats.engineeringLocked&&!retainsBakedExperimental){const{experimental:originalExperimental,...withoutExperimental}=variant;const currentExperimental=engineering?.ExperimentalEffect;const currentVariant=typeof currentExperimental==="string"?{...withoutExperimental,experimental:currentExperimental}:withoutExperimental;variantStats=getPreEngineeredStats(withoutExperimental);primitiveModifiers.set(module.Slot,[...engineering?.Modifiers??[],...getPreEngineeredModifiers(currentVariant)])}if(variantStats)moduleStats.set(module.Slot,cloneModuleStats(variantStats));const guardianFinal=typeof engineering?.BlueprintName==="string"&&isFinalGuardianWeaponEngineering(module.Item,engineering.BlueprintName);if(variantStats?.engineeringLocked||typeof engineering?.BlueprintName!=="string"||!guardianFinal){continue}const normalizedBlueprint=normalizeKey(engineering.BlueprintName,"ShipLoadout.fromLoadout: module.Engineering.BlueprintName");const normalizedExperimental=normalizeKey(engineering.ExperimentalEffect,"ShipLoadout.fromLoadout: module.Engineering.ExperimentalEffect");const variants=getPreEngineeredVariants(module.Item);const exact=variants.find(candidate=>candidate.engineeringLocked===true&&candidate.blueprint.toLowerCase()===normalizedBlueprint&&candidate.grade===engineering.Level&&candidate.experimental?.toLowerCase()===normalizedExperimental);const guardianBase=variants.find(candidate=>candidate.engineeringLocked===true&&candidate.blueprint.toLowerCase()===normalizedBlueprint&&candidate.grade===engineering.Level&&candidate.experimental===void 0);const stats=exact?getPreEngineeredStats(exact):guardianBase&&engineering.ExperimentalEffect!==void 0?getPreEngineeredStats({...guardianBase,experimental:engineering.ExperimentalEffect}):builtInModuleBySymbol(module.Item,"ShipLoadout.fromLoadout: module.Item");if(stats){moduleStats.set(module.Slot,cloneModuleStats({...stats,engineeringLocked:true}))}}return{shipSymbol:event.Ship,modules:modules,moduleStats:moduleStats,primitiveModifiers:primitiveModifiers,top:top,sourcePurchase:sourcePurchaseFromLoadout(event),outcomes:deepFreeze(outcomes)}}var SLOT_KEY="ShipLoadout: slotKey";var requireLoadOptions=(scope,options)=>{for(const field of["fuel","cargo"]){const value=options[field];if(value!==void 0&&(!Number.isFinite(value)||value<0)){throw new RangeError(`${scope}: ${field} must be a finite non-negative number`)}}};var requireEnginesPips=(scope,enginesPips)=>{if(!Number.isFinite(enginesPips)||enginesPips<0||enginesPips>4){throw new RangeError(`${scope}: enginesPips must be a finite number from 0 to 4`)}return enginesPips};var requireSystemsPips=(scope,systemsPips)=>{if(!Number.isFinite(systemsPips)||systemsPips<0||systemsPips>4){throw new RangeError(`${scope}: systemsPips must be a finite number from 0 to 4`)}return systemsPips};var LoadoutEditError=class extends TypeError{code;constraint;params;constructor(message,code,params,constraint){super(message);this.code=code;this.params=deepFreeze(structuredClone(params));if(constraint!==void 0)this.constraint=constraint}};var experimentalEffectUnsupported=(code,params)=>deepFreeze({kind:"unsupported",code:code,params:params});var engineeringNormalizationUnsupported=(code,params)=>deepFreeze({kind:"unsupported",code:code,params:params});var AGGREGATE_STATS=["mass","cargoCapacity","fuelCapacity"];var ShipLoadout=class _ShipLoadout{#ship;#shipSymbol;#modules;#moduleStats;#primitiveModifiers;#top;#sourcePurchase;#importOutcomes;#slotCache=/* @__PURE__ */new Map;#layoutCache;constructor(ship,shipSymbol,modules,top,sourcePurchase=null,moduleStats=/* @__PURE__ */new Map,primitiveModifiers=/* @__PURE__ */new Map,importOutcomes=deepFreeze([])){this.#ship=ship;this.#shipSymbol=shipSymbol;this.#modules=modules;this.#top=top;this.#sourcePurchase=sourcePurchase;this.#moduleStats=moduleStats;this.#primitiveModifiers=primitiveModifiers;this.#importOutcomes=importOutcomes}static fromSlef(input,index=0){const entries=parseSlef(input);const entry=entries[index];if(!entry){throw new TypeError(`ShipLoadout.fromSlef: no entry at index ${truncate(index)} (have ${entries.length})`)}const imported=normalizeLoadoutEvent(entry.data);const ship=getShipBySymbol(imported.shipSymbol);if(!ship){throw new TypeError(`ShipLoadout.fromSlef: unknown hull "${truncate(imported.shipSymbol)}"`)}return _ShipLoadout.#fromImported(imported,ship)}static fromLoadout(event){if(event===null||typeof event!=="object"){throw new TypeError(`ShipLoadout.fromLoadout: event must be a Loadout event, received ${describeValue(event)}`)}const imported=normalizeLoadoutEvent(event);const ship=getShipBySymbol(imported.shipSymbol);if(!ship){throw new TypeError(`ShipLoadout.fromLoadout: unknown hull "${truncate(imported.shipSymbol)}"`)}return _ShipLoadout.#fromImported(imported,ship)}static#fromImported(imported,ship){return new _ShipLoadout(ship,imported.shipSymbol,imported.modules,imported.top,imported.sourcePurchase,imported.moduleStats,imported.primitiveModifiers,imported.outcomes)}static empty(shipSymbol){const requested=requireString(shipSymbol,"ShipLoadout.empty: shipSymbol");const ship=getShipBySymbol(requested);if(!ship){throw new TypeError(`ShipLoadout.empty: no slot layout for hull "${truncate(shipSymbol)}"`)}const fitted=(getDefaultLoadout(ship.symbol)?.modules??[]).filter(module=>{const parsed=parseSlotName(module.slot);return parsed!==null&&fixedSlotReason(parsed)!==null});return new _ShipLoadout(ship,ship.symbol,new Map(fitted.map(module=>[module.slot,{Slot:module.slot,Item:module.symbol}])),{})}static default(shipSymbol){const requested=requireString(shipSymbol,"ShipLoadout.default: shipSymbol");const ship=getShipBySymbol(requested);if(!ship){throw new TypeError(`ShipLoadout.default: no default loadout for hull "${truncate(shipSymbol)}"`)}const loadout=getDefaultLoadout(ship.symbol);return new _ShipLoadout(ship,loadout.symbol,new Map(loadout.modules.map(module=>[module.slot,{Slot:module.slot,Item:module.symbol}])),{})}get shipSymbol(){return this.#shipSymbol}get shipName(){return this.#top.ShipName??null}get shipIdent(){return this.#top.ShipIdent??null}get unladenMass(){return this.#top.UnladenMass??this.#computedUnladenMass()}#computedUnladenMass(){return calculateUnladenMass(this.#ship.hullMass,this.#calculationModules())}get fuelCapacity(){const cap=this.#top.FuelCapacity;if(cap?.Main!==void 0&&cap.Reserve!==void 0){return Object.freeze({main:cap.Main,reserve:cap.Reserve})}const computed=this.#computedFuelCapacity();return Object.freeze({main:cap?.Main??computed.main,reserve:cap?.Reserve??computed.reserve})}get cargoCapacity(){return this.#top.CargoCapacity??this.#computedCargoCapacity()}#computedCargoCapacity(){return calculateCargoCapacity(this.#calculationModules())}#computedFuelCapacity(){return calculateFuelCapacity(this.#ship.reserveFuelCapacity,this.#calculationModules())}get hullValue(){return this.#top.HullValue??null}get modulesValue(){return this.#top.ModulesValue??null}get rebuy(){return this.#top.Rebuy??null}get sourcePurchase(){return this.#sourcePurchase}get importOutcomes(){return this.#importOutcomes}get validation(){const slots=this.#layout();const byKey=new Map(slots.map(slot=>[slot.key.toLowerCase(),slot]));const modules=[...this.#modules.values()].map(module=>{const stats=this.#statsFor(module);const slot=byKey.get(module.Slot.toLowerCase());const builtIn=stats===null&&isNonOutfittingSlot(module.Slot)||isBuiltInHullModule(module);const fitProblem=stats&&slot&&!builtIn?moduleFitProblem(this.#shipSymbol,slot,stats):null;return{slot:module.Slot,symbol:module.Item,requiresKnownSlot:!builtIn,fitError:fitProblem?.message??null,...fitProblem===null?{}:{fitConstraint:fitProblem.constraint},...fitProblem?.params===void 0?{}:{fitParams:fitProblem.params},...stats?.exclusionGroup===void 0?{}:{exclusionGroup:stats.exclusionGroup},...stats?.limitGroup===void 0?{}:{limitGroup:stats.limitGroup},...stats?.limitIncrease===void 0?{}:{limitIncrease:stats.limitIncrease}}});return validateLoadout({shipSymbol:this.#shipSymbol,slots:slots,modules:modules})}slots(kind){const cached=this.#slotCache.get(kind);if(cached!==void 0)return cached;const slots=kind===void 0?this.#layout():this.#layout().filter(slot=>slot.kind===kind);const currentLimits=this.#moduleLimits();const value=deepFreeze(slots.map(slot=>{const stats=this.#moduleStatsAt(slot.key);const fixedReason=fixedSlotReason(slot);const immovableReason=fixedReason!==null?fixedReason:stats?.limitIncrease!==void 0&&this.#moduleLimitRegression(slot.key,null,currentLimits,stats)!==null?"moduleLimit":null;return{...slot,name:loadoutSlotName(slot),module:this.fittedModuleAt(slot.key),removable:immovableReason===null,...immovableReason===null?{}:{immovableReason:immovableReason}}}));this.#slotCache.set(kind,value);return value}fittedModuleAt(slotKey){const module=this.#fittedModuleFor(slotKey);if(!module)return null;const raw=cloneLoadoutModule(module);const stats=this.#statsFor(module);const effective=effectiveModule(this.#moduleForEffectiveStats(module),stats);return deepFreeze({slot:module.Slot,symbol:raw.Item,on:raw.On,priority:raw.Priority,health:raw.Health,value:raw.Value,engineering:raw.Engineering,raw:raw,stats:stats===null?null:cloneModuleStats(stats),effectiveStats:effective===null?null:cloneModuleStats(effective),ammunition:ammunitionCapacity(effective),preEngineeredVariant:identifyPreEngineeredVariant(raw)})}fittedModules(){return deepFreeze([...this.#modules.keys()].flatMap(key=>{const fitted=this.fittedModuleAt(key);return fitted===null?[]:[fitted]}))}availableBlueprints(slotKey){const module=this.#fittedModuleFor(slotKey);return deepFreeze(module?availableBlueprintsFor(module.Item,this.#statsFor(module)):[])}availableExperimentalEffects(slotKey){const module=this.#fittedModuleFor(slotKey);return deepFreeze(module?availableExperimentalsFor(module.Item,this.#statsFor(module)):[])}modulesForSlot(slotKey){const slot=this.#requireSlot(slotKey);const occupied=new Set([...this.#modules.values()].flatMap(fitted=>{if(fitted.Slot.toLowerCase()===slot.key.toLowerCase())return[];const group=this.#statsFor(fitted)?.exclusionGroup;return group===void 0?[]:[group]}));const currentLimits=this.#moduleLimits();const currentStats=this.#moduleStatsAt(slot.key);return ALL_MODULES.filter(module=>moduleFitError(this.#shipSymbol,slot,module)===null&&(module.exclusionGroup===void 0||!occupied.has(module.exclusionGroup))&&this.#moduleLimitRegression(slot.key,module,currentLimits,currentStats)===null)}repairFixedMount(slotKey){const requested=requireString(slotKey,SLOT_KEY);const wanted=requested.toLowerCase();const slot=this.#requireSlot(requested);const fittedKey=this.#fittedKey(requested);const resultSlot=fittedKey??requested;const canonicalKey=slot.key;if(fixedSlotReason(slot)===null){return deepFreeze({status:"refused",slot:resultSlot,reason:"notFixedMount"})}const current=this.#fittedModuleFor(requested);const currentStats=current?this.#statsFor(current):null;const valid=current!==void 0&&currentStats!==null&&(slot.kind==="cargoHatch"?isBuiltInHullModule(current):moduleFitProblem(this.#shipSymbol,slot,currentStats)===null);if(valid){return deepFreeze({status:"unchanged",slot:current.Slot,symbol:current.Item})}const defaultModule=getDefaultLoadout(this.#shipSymbol)?.modules.find(module=>module.slot.toLowerCase()===wanted);if(!defaultModule){return deepFreeze({status:"defaultUnavailable",slot:resultSlot})}const ownKey=ownKeyIn(this.#modules,canonicalKey);const replacement={Slot:ownKey,Item:defaultModule.symbol,...current?.On===void 0?{}:{On:current.On},...current?.Priority===void 0?{}:{Priority:current.Priority},...current?.Health===void 0?{}:{Health:current.Health}};const replacementStats=builtInModuleBySymbol(defaultModule.symbol,"ShipLoadout.repairFixedMount")??(isBuiltInHullModule(replacement)?builtInModuleBySymbol("ModularCargoBayDoor","ShipLoadout.repairFixedMount"):null);if(!replacementStats){return deepFreeze({status:"defaultUnavailable",slot:resultSlot,symbol:defaultModule.symbol})}this.#replaceModule(ownKey,replacement,replacementStats);return deepFreeze({status:"repaired",slot:ownKey,symbol:defaultModule.symbol})}setModule(slotKey,module){const slot=this.#requireSlot(slotKey);if(module===null||module===void 0){throw new TypeError(`ShipLoadout.setModule: no module supplied for "${truncate(slotKey)}" (did the module lookup return undefined?)`)}if(typeof module.symbol!=="string"){throw new TypeError(`ShipLoadout.setModule: module for "${truncate(slotKey)}" must be an outfitting module, received ${describeValue(module)}`)}module=cloneModuleStats(module);const catalogued=builtInModuleBySymbol(module.symbol,FITTED_ITEM);if(catalogued===null){throw new TypeError(`ShipLoadout.setModule: no module is catalogued as "${truncate(module.symbol)}"`)}for(const field of AGGREGATE_STATS){const stated=module[field];if(stated===void 0){if(catalogued[field]===void 0)continue;throw new TypeError(`ShipLoadout.setModule: the supplied record for "${truncate(module.symbol)}" has no ${field}`)}if(typeof stated!=="number"||!Number.isFinite(stated)){throw new TypeError(`ShipLoadout.setModule: the supplied record for "${truncate(module.symbol)}" states a ${field} of ${describeValue(stated)}`)}}const problem2=moduleFitProblem(this.#shipSymbol,slot,module);if(problem2){if(problem2.constraint==="immutableSlot"){throw new LoadoutEditError(`ShipLoadout.setModule: ${truncate(module.symbol)} → ${truncate(slotKey)}: ${problem2.message}`,"immutableSlot",{slot:slot.key})}throw new LoadoutEditError(`ShipLoadout.setModule: ${truncate(module.symbol)} → ${truncate(slotKey)}: ${problem2.message}`,"incompatibleModule",{...problem2.params,slot:slot.key,symbol:module.symbol,constraint:problem2.constraint},problem2.constraint)}if(module.exclusionGroup!==void 0){const conflict=[...this.#modules.values()].find(fitted=>fitted.Slot.toLowerCase()!==slot.key.toLowerCase()&&this.#statsFor(fitted)?.exclusionGroup===module.exclusionGroup);if(conflict){throw new LoadoutEditError(`ShipLoadout.setModule: ${truncate(module.symbol)} → ${truncate(slotKey)}: ${module.exclusionGroup} is limited to one per ship (already fitted in ${truncate(conflict.Slot)})`,"duplicateExclusiveModule",{exclusionGroup:module.exclusionGroup,slot:slot.key,symbol:module.symbol,previousSlot:conflict.Slot,previousSymbol:conflict.Item})}}const limitProblem=this.#moduleLimitRegression(slot.key,module);if(limitProblem!==null){throw new LoadoutEditError(`ShipLoadout.setModule: ${truncate(module.symbol)} → ${truncate(slotKey)}: ${limitProblem.group} would have ${limitProblem.count} modules but the ship allows ${limitProblem.limit}`,"moduleLimitExceeded",{group:limitProblem.group,count:limitProblem.count,limit:limitProblem.limit,slot:slot.key,symbol:module.symbol})}const key=this.#fittedKey(slotKey)??slot.key;this.#replaceModule(key,{Slot:key,Item:module.symbol},module);return this}removeModule(slotKey){const wanted=requireString(slotKey,SLOT_KEY).toLowerCase();if(wanted==="cargohatch"){throw new LoadoutEditError("ShipLoadout.removeModule: the cargoHatch slot cannot be changed","immutableSlot",{slot:"CargoHatch"})}const parsed=parseSlotName(slotKey);const slot=this.#layout().find(candidate=>candidate.key.toLowerCase()===wanted);if(parsed!==null&&fixedSlotReason(parsed)==="requiredSlot"){const fittedKey=this.#fittedKey(slotKey);const key2=slot?.key??fittedKey??slotKey;throw new LoadoutEditError(`ShipLoadout.removeModule: the ${truncate(key2)} slot is required and cannot be emptied`,"requiredSlot",{slot:key2})}const key=this.#fittedKey(slotKey);if(key!==null){const limitProblem=this.#moduleLimitRegression(key,null);if(limitProblem!==null){const fitted=this.#modules.get(key);throw new LoadoutEditError(`ShipLoadout.removeModule: ${truncate(slotKey)}: ${limitProblem.group} would have ${limitProblem.count} modules but the ship allows ${limitProblem.limit}`,"moduleLimitExceeded",{group:limitProblem.group,count:limitProblem.count,limit:limitProblem.limit,slot:key,...fitted===void 0?{}:{symbol:fitted.Item}})}this.#replaceModule(key,null)}return this}applyBlueprint(slotKey,fdname,options){requireString(fdname,"ShipLoadout.applyBlueprint: fdname");if(options===null||typeof options!=="object"){throw new TypeError(`ShipLoadout.applyBlueprint: options must be an object with a grade, received ${describeValue(options)}`)}const wantedGrade=options.grade;const wantedQuality=options.quality;const wantedExperimental=options.experimental??void 0;requireStringIfPresent(wantedExperimental,"ShipLoadout.applyBlueprint: options.experimental");const module=this.#fittedModuleFor(slotKey);if(!module){throw new RangeError(`ShipLoadout.applyBlueprint: slot "${truncate(slotKey)}" is empty`)}const fittedStats=this.#statsFor(module);if(!fittedStats){throw new TypeError(`ShipLoadout.applyBlueprint: no stats for module "${truncate(module.Item)}"`)}const recipe=resolveBlueprintForModule(module.Item,fdname);const named=recipe===fdname?`"${truncate(fdname)}"`:`"${truncate(fdname)}" (${truncate(recipe)} on this module)`;const written=fdname.trim().toLowerCase();const resolved=recipe.trim().toLowerCase();if(getPreEngineeredVariants(module.Item).some(variant=>variant.acquisition==="eventReward"&&(variant.blueprint.toLowerCase()===written||variant.blueprint.toLowerCase()===resolved))){throw new TypeError(`ShipLoadout.applyBlueprint: ${named} is a fixed pre-engineered identity, not a craftable blueprint; use setPreEngineeredVariant to fit its fixed article`)}if(!Number.isInteger(wantedGrade)||wantedGrade<1||wantedGrade>5){throw new RangeError(`ShipLoadout.applyBlueprint: no blueprint ${named} grade ${truncate(wantedGrade)}`)}const grade=getBlueprintGrade(recipe,wantedGrade);if(!grade){throw new RangeError(`ShipLoadout.applyBlueprint: no blueprint ${named} grade ${truncate(wantedGrade)}`)}let experimental;if(wantedExperimental!==void 0){experimental=getExperimentalEffect(wantedExperimental);if(!experimental){throw new RangeError(`ShipLoadout.applyBlueprint: unknown experimental effect "${truncate(wantedExperimental)}"`)}}const quality=wantedQuality??1;if(!Number.isFinite(quality)||quality<0||quality>1){throw new RangeError(`ShipLoadout.applyBlueprint: quality must be a finite number in [0, 1]`)}if(fittedStats.engineeringLocked){throw new TypeError(`ShipLoadout.applyBlueprint: module "${truncate(module.Item)}" is a final pre-engineered article and accepts no further engineering`)}if(!blueprintAvailableFor(module.Item,fdname)){const offered=[...blueprintRoutesFor(module.Item)].map(([blueprint,route])=>`${blueprint} (${route})`);throw new TypeError(offered.length>0?`ShipLoadout.applyBlueprint: module "${truncate(module.Item)}" is not offered blueprint ${named}; available candidates are ${offered.join(", ")}`:`ShipLoadout.applyBlueprint: no registry lists an engineering menu for module "${truncate(module.Item)}"`)}if(wantedExperimental!==void 0&&!experimentalAvailableFor(module.Item,wantedExperimental)){const offered=getExperimentalsForModule(module.Item);throw new TypeError(`ShipLoadout.applyBlueprint: module "${truncate(module.Item)}" is not offered experimental effect "${truncate(wantedExperimental)}"; it takes ${offered.length>0?offered.join(", "):"no experimental effect"}`)}const stats=this.#engineeringBaseStats(module)??fittedStats;const base=baseStats(stats);const canonical=primitiveEngineeringInputsFor(stats,grade,experimental);const missing=missingBaseLabels(stats,base,canonical.grade.features,canonical.experimental?.modifiers);if(missing.length>0){throw new TypeError(`ShipLoadout.applyBlueprint: cannot compute ${named} for module "${truncate(module.Item)}"; missing base stats for ${missing.join(", ")}`)}const damageDistribution=experimental?.damageDistribution??grade.damageDistribution;const primitiveModifiers=computeModifiers(base,canonical.grade,quality,canonical.experimental);const modifiers=journalModifiersFor(stats,primitiveModifiers);if(damageDistribution){for(const type of["kinetic","thermal","explosive","absolute"]){const value=damageDistribution[type];if(value===void 0)continue;const label=labelsForDamageType(type)[0];if(label===void 0)continue;const damageModifier={Label:label,Value:value*scaleForLabel(label),OriginalValue:(stats.damageDistribution?.[type]??0)*scaleForLabel(label)};modifiers.push(damageModifier);primitiveModifiers.push(damageModifier)}}const engineering={BlueprintName:fdname,Level:wantedGrade,Quality:quality,...wantedExperimental!==void 0?{ExperimentalEffect:wantedExperimental}:{},Modifiers:modifiers};this.#replaceModule(module.Slot,{...module,Engineering:engineering},stats,primitiveModifiers);return this}setExperimentalEffect(slotKey,experimental){if(experimental!==null){requireString(experimental,"ShipLoadout.setExperimentalEffect: experimental")}const wanted=experimental;const module=this.#fittedModuleFor(slotKey);if(!module)return experimentalEffectUnsupported("emptySlot",{slot:slotKey});const stats=this.#statsFor(module);if(!stats){return experimentalEffectUnsupported("unsupportedEngineering",{slot:module.Slot,symbol:module.Item})}const engineering=module.Engineering;if(!engineering){return experimentalEffectUnsupported("notEngineered",{slot:module.Slot,symbol:module.Item})}if(stats.engineeringLocked){return experimentalEffectUnsupported("finalArticle",{slot:module.Slot,symbol:module.Item})}const previous=engineering.ExperimentalEffect??null;if(previous===null&&wanted===null||previous!==null&&wanted!==null&&previous.trim().toLowerCase()===wanted.trim().toLowerCase()){return deepFreeze({kind:"unchanged",experimental:previous})}const variant=identifyPreEngineeredVariant(module);let effect;if(wanted!==null){effect=getExperimentalEffect(wanted);if(!effect){return experimentalEffectUnsupported("unknownExperimentalEffect",{slot:module.Slot,symbol:module.Item,experimental:wanted})}const restoresBakedEffect=variant?.experimental!==void 0&&variant.experimental.trim().toLowerCase()===wanted.trim().toLowerCase();if(!experimentalAvailableFor(module.Item,wanted)&&!restoresBakedEffect){return experimentalEffectUnsupported("unsupportedExperimentalEffect",{slot:module.Slot,symbol:module.Item,experimental:wanted})}}if(variant&&variant.acquisition!=="mercenary"){const stock=this.#engineeringBaseStats(module);if(!stock){return experimentalEffectUnsupported("unsupportedEngineering",{slot:module.Slot,symbol:module.Item})}const missing=missingBaseLabels(stock,baseStats(stock),[],effect?.modifiers);if(missing.length>0){return experimentalEffectUnsupported("unresolvedModifiers",{slot:module.Slot,symbol:module.Item,labels:missing})}const{experimental:originalEffect,...withoutEffect}=variant;const adjusted=wanted===null?withoutEffect:{...withoutEffect,experimental:wanted};const resolved=getPreEngineeredStats(withoutEffect);if(!resolved){return experimentalEffectUnsupported("unsupportedEngineering",{slot:module.Slot,symbol:module.Item})}const replacement={BlueprintName:engineering.BlueprintName,Level:engineering.Level,Quality:engineering.Quality,...wanted===null?{}:{ExperimentalEffect:wanted},Modifiers:getPreEngineeredJournalModifiers(adjusted)};this.#replaceModule(module.Slot,{...module,Engineering:replacement},cloneModuleStats(resolved),getPreEngineeredModifiers(adjusted))}else{const blueprint=engineering.BlueprintName;const grade=engineering.Level;const quality=engineering.Quality;if(typeof blueprint!=="string"||!Number.isInteger(grade)||grade<1||grade>5){return experimentalEffectUnsupported("unsupportedEngineering",{slot:module.Slot,symbol:module.Item})}const currentEffect=previous===null?void 0:getExperimentalEffect(previous)??null;if(ordinaryEngineeringProof(module.Item,engineering,currentEffect)==="unproven"){return experimentalEffectUnsupported("unidentifiedPreEngineeredVariant",{slot:module.Slot,symbol:module.Item,blueprint:blueprint})}const recipe=resolveBlueprintForModule(module.Item,blueprint);const blueprintGrade=getBlueprintGrade(recipe,grade);if(!blueprintGrade||!blueprintAvailableFor(module.Item,blueprint)||!Number.isFinite(quality)||quality<0||quality>1){return experimentalEffectUnsupported("unsupportedEngineering",{slot:module.Slot,symbol:module.Item,blueprint:blueprint,grade:grade})}const base=this.#engineeringBaseStats(module)??stats;const canonical=primitiveEngineeringInputsFor(base,blueprintGrade,effect);const missing=missingBaseLabels(base,baseStats(base),canonical.grade.features,canonical.experimental?.modifiers);if(missing.length>0){return experimentalEffectUnsupported("unresolvedModifiers",{slot:module.Slot,symbol:module.Item,labels:missing})}this.applyBlueprint(module.Slot,blueprint,{grade:grade,quality:quality,...wanted===null?{}:{experimental:wanted}})}return deepFreeze({kind:"updated",previousExperimental:previous,experimental:wanted})}completeEngineeringGrade(slotKey){const module=this.#fittedModuleFor(slotKey);if(!module)return engineeringNormalizationUnsupported("emptySlot",{slot:slotKey});const stats=this.#statsFor(module);if(!stats){return engineeringNormalizationUnsupported("unsupportedEngineering",{slot:module.Slot,symbol:module.Item})}const engineering=module.Engineering;if(!engineering){return engineeringNormalizationUnsupported("notEngineered",{slot:module.Slot,symbol:module.Item})}if(stats.engineeringLocked){return engineeringNormalizationUnsupported("finalArticle",{slot:module.Slot,symbol:module.Item})}if(engineering.Quality===1){return deepFreeze({kind:"unchanged"})}const previousQuality=engineering.Quality;if(!Number.isFinite(previousQuality)||previousQuality<0||previousQuality>1){return engineeringNormalizationUnsupported("invalidQuality",{slot:module.Slot,symbol:module.Item})}const experimental=engineering.ExperimentalEffect??null;const effect=experimental===null?void 0:getExperimentalEffect(experimental)??void 0;if(experimental!==null&&!effect){return engineeringNormalizationUnsupported("unknownExperimentalEffect",{slot:module.Slot,symbol:module.Item,experimental:experimental})}const blueprint=engineering.BlueprintName;const grade=engineering.Level;if(typeof blueprint!=="string"||!Number.isInteger(grade)||grade<1||grade>5){return engineeringNormalizationUnsupported("unsupportedEngineering",{slot:module.Slot,symbol:module.Item})}const variant=identifyPreEngineeredVariant(module);const restoresBakedEffect=variant?.experimental!==void 0&&variant.experimental.trim().toLowerCase()===experimental?.trim().toLowerCase();if(experimental!==null&&!experimentalAvailableFor(module.Item,experimental)&&!restoresBakedEffect){return engineeringNormalizationUnsupported("unsupportedExperimentalEffect",{slot:module.Slot,symbol:module.Item,experimental:experimental})}if(variant&&variant.acquisition!=="mercenary"){const stock=this.#engineeringBaseStats(module);if(!stock){return engineeringNormalizationUnsupported("unsupportedEngineering",{slot:module.Slot,symbol:module.Item})}const missing=missingBaseLabels(stock,baseStats(stock),[],effect?.modifiers);if(missing.length>0){return engineeringNormalizationUnsupported("unresolvedModifiers",{slot:module.Slot,symbol:module.Item,labels:missing})}const{experimental:originalEffect,...withoutEffect}=variant;const adjusted=experimental===null?withoutEffect:{...withoutEffect,experimental:experimental};const resolved=getPreEngineeredStats(withoutEffect);if(!resolved){return engineeringNormalizationUnsupported("unsupportedEngineering",{slot:module.Slot,symbol:module.Item})}const replacement={BlueprintName:engineering.BlueprintName,Level:engineering.Level,Quality:1,...experimental===null?{}:{ExperimentalEffect:experimental},Modifiers:getPreEngineeredJournalModifiers(adjusted)};this.#replaceModule(module.Slot,{...module,Engineering:replacement},cloneModuleStats(resolved),getPreEngineeredModifiers(adjusted))}else{const proof=ordinaryEngineeringProof(module.Item,engineering,effect);if(proof==="unproven"||proof==="proven"&&!blueprintAvailableFor(module.Item,blueprint)){return engineeringNormalizationUnsupported("unidentifiedPreEngineeredVariant",{slot:module.Slot,symbol:module.Item,blueprint:blueprint})}const recipe=resolveBlueprintForModule(module.Item,blueprint);const blueprintGrade=getBlueprintGrade(recipe,grade);if(!blueprintGrade||!blueprintAvailableFor(module.Item,blueprint)){return engineeringNormalizationUnsupported("unsupportedEngineering",{slot:module.Slot,symbol:module.Item,blueprint:blueprint,grade:grade})}const base=this.#engineeringBaseStats(module)??stats;const canonical=primitiveEngineeringInputsFor(base,blueprintGrade,effect);const missing=missingBaseLabels(base,baseStats(base),canonical.grade.features,canonical.experimental?.modifiers);if(missing.length>0){return engineeringNormalizationUnsupported("unresolvedModifiers",{slot:module.Slot,symbol:module.Item,labels:missing})}this.applyBlueprint(module.Slot,blueprint,{grade:grade,quality:1,...experimental===null?{}:{experimental:experimental}})}return deepFreeze({kind:"normalized",previousQuality:previousQuality,quality:1})}setPreEngineeredVariant(slotKey,variant){if(variant===null||typeof variant!=="object"){throw new TypeError(`ShipLoadout.setPreEngineeredVariant: variant must be a pre-engineered variant, received ${describeValue(variant)}`)}requireString(variant.symbol,"ShipLoadout.setPreEngineeredVariant: variant.symbol");requireString(variant.blueprint,"ShipLoadout.setPreEngineeredVariant: variant.blueprint");requireString(variant.acquisition,"ShipLoadout.setPreEngineeredVariant: variant.acquisition");requireStringIfPresent(variant.experimental,"ShipLoadout.setPreEngineeredVariant: variant.experimental");const known=getPreEngineeredVariants(variant.symbol).find(candidate=>candidate.blueprint.toLowerCase()===variant.blueprint.toLowerCase()&&candidate.grade===variant.grade&&(candidate.experimental?.toLowerCase()??"")===(variant.experimental?.toLowerCase()??"")&&candidate.acquisition===variant.acquisition);if(!known){throw new RangeError(`ShipLoadout.setPreEngineeredVariant: no catalogued variant "${truncate(variant.blueprint)}" for module "${truncate(variant.symbol)}"`)}const stats=getPreEngineeredStats(known);const unresolved=unresolvedModifiers(known);if(unresolved.length>0){throw new TypeError(`ShipLoadout.setPreEngineeredVariant: cannot resolve "${truncate(variant.blueprint)}" for module "${truncate(variant.symbol)}"; missing base stats for ${unresolved.join(", ")}`)}this.setModule(slotKey,stats);const module=this.#fittedModuleFor(slotKey);const engineering={BlueprintName:known.blueprint,Level:known.grade,Quality:1,...known.experimental===void 0?{}:{ExperimentalEffect:known.experimental},...known.modifiers?.length?{Modifiers:getPreEngineeredJournalModifiers(known)}:{}};this.#replaceModule(module.Slot,{...module,Engineering:engineering},cloneModuleStats(stats),getPreEngineeredModifiers(known));return this}clearEngineering(slotKey){const module=this.#fittedModuleFor(slotKey);if(module&&this.#statsFor(module)?.engineeringLocked){throw new TypeError(`ShipLoadout.clearEngineering: module "${truncate(module.Item)}" is a final pre-engineered article and its engineering cannot be removed`)}if(module?.Engineering){const baseStats2=this.#engineeringBaseStats(module);const bare={Slot:module.Slot,Item:module.Item};if(module.On!==void 0)bare.On=module.On;if(module.Priority!==void 0){bare.Priority=module.Priority}if(module.Health!==void 0)bare.Health=module.Health;if(module.Value!==void 0)bare.Value=module.Value;this.#replaceModule(module.Slot,bare,baseStats2??void 0)}return this}setModuleEnabled(slotKey,on){this.#patchModule(slotKey,{On:on});return this}setModulePriority(slotKey,priority){if(!Number.isInteger(priority)||priority<0||priority>4){throw new RangeError(`ShipLoadout: power priority must be an integer 0-4, got ${truncate(priority)}`)}this.#patchModule(slotKey,{Priority:priority});return this}#patchModule(slotKey,patch){const module=this.#fittedModuleFor(slotKey);if(!module){throw new RangeError(`ShipLoadout: slot "${truncate(slotKey)}" is empty`)}this.#modules.set(module.Slot,cloneLoadoutModule({...module,...patch}));this.#slotCache.clear()}toLoadoutEvent(options={}){const unladenMass=this.#computedUnladenMass();const cargoCapacity=this.#computedCargoCapacity();const fuel=this.#computedFuelCapacity();const maxJumpRange=this.#exportableJumpRange(unladenMass);return exportLoadoutEvent({shipSymbol:this.#shipSymbol,...this.#top.ShipName===void 0?{}:{shipName:this.#top.ShipName},...this.#top.ShipIdent===void 0?{}:{shipIdent:this.#top.ShipIdent},modules:this.#modules,layout:this.#layout(),sourcePurchase:this.#sourcePurchase,retailHullValue:this.#ship.hullCost,unladenMass:unladenMass,cargoCapacity:cargoCapacity,fuelCapacity:fuel,maxJumpRange:maxJumpRange,sourceTotalsVoided:this.#importOutcomes.some(outcome=>outcome.sourceSymbol===null&&parseSlotName(outcome.slot)?.kind==="core"),statsFor:module=>this.#statsFor(module)},options)}toSlef(options){return toSlef(this.toLoadoutEvent(options),options.header)}toSlefString(options){return stringifySlef(this.toSlef(options),{indent:options.indent??0})}#exportableJumpRange(unladenMass){let drive;try{drive=this.#resolveDrive()}catch{return null}if(drive===null)return null;const tank=this.#computedFuelCapacity();return singleJumpRange(unladenMass,Math.min(tank.main,drive.maxFuel),drive)}get frameShiftDrive(){const drive=this.#resolveDrive();if(drive===null)throw new TypeError("ShipLoadout: build has no frame shift drive");return drive}#maxJumpFuel(fsd){return Math.min(this.fuelCapacity.main,fsd.maxFuel)}frameShiftDriveMassFactor(options={}){requireLoadOptions("ShipLoadout.frameShiftDriveMassFactor",options);const fuel=options.fuel??this.fuelCapacity.main;return frameShiftDriveMassFactor(this.#requireMass(options.cargo??0),fuel,this.frameShiftDrive)}maxJumpRange(){const fsd=this.frameShiftDrive;return singleJumpRange(this.#requireMass(0),this.#maxJumpFuel(fsd),fsd)}jumpRange(options={}){requireLoadOptions("ShipLoadout.jumpRange",options);const fsd=this.frameShiftDrive;const fuel=options.fuel??this.fuelCapacity.main;return singleJumpRange(this.#requireMass(options.cargo??0),fuel,fsd)}ladenJumpRange(){return this.jumpRange({cargo:this.cargoCapacity})}fuelPerJump(distance,options={}){requireLoadOptions("ShipLoadout.fuelPerJump",options);const fsd=this.frameShiftDrive;const fuel=options.fuel??this.fuelCapacity.main;return fuelPerJump(distance,this.#requireMass(options.cargo??0),fuel,fsd)}totalRange(options={}){requireLoadOptions("ShipLoadout.totalRange",options);return totalRange(this.#requireMass(options.cargo??0),options.fuel??this.fuelCapacity.main,this.frameShiftDrive)}standardLoadResult(load){if(load!=="maximum"&&load!=="unladen"&&load!=="laden"){throw new RangeError("ShipLoadout.standardLoadResult: load must be 'maximum', 'unladen', or 'laden'")}const fuel=this.fuelCapacity;const cargo=load==="laden"?this.cargoCapacity:0;const mass=load==="maximum"?this.unladenMass:0;const issues=[];let drive=null;let maximumFuel=null;if(load==="maximum"){const fitted=this.#frameShiftDrive()?.module;let driveError=null;try{drive=this.#resolveDrive();maximumFuel=drive?.maxFuel??null}catch(error){if(!(error instanceof Error))throw error;driveError=error}if(maximumFuel===null){issues.push({field:"frameShiftDrive",reason:fitted?"unresolved":"missing",slot:fitted?.Slot??"FrameShiftDrive",...fitted?{symbol:fitted.Item}:{},message:driveError?.message??"FrameShiftDrive: no frame shift drive is fitted",params:fitted?{field:"frameShiftDrive",reason:"unresolved",slot:fitted.Slot,symbol:fitted.Item}:{field:"frameShiftDrive",reason:"missing",slot:"FrameShiftDrive"}})}}if(issues.length>0){return incompleteResult(issues)}const value=Object.freeze({fuel:load==="maximum"?Math.min(fuel.main,maximumFuel):fuel.main,cargo:cargo});if(load==="maximum"){try{this.jumpRange(value)}catch(error){if(!(error instanceof RangeError))throw error;const fitted=this.#frameShiftDrive()?.module;const field=drive!==null&&(!Number.isFinite(drive.maxFuel)||drive.maxFuel<0)?"frameShiftDrive":!Number.isFinite(value.fuel)||value.fuel<0?"fuelCapacity":!Number.isFinite(mass)||mass<0?"mass":"frameShiftDrive";const driveParams=field==="frameShiftDrive"&&fitted?{slot:fitted.Slot,symbol:fitted.Item}:{};return incompleteResult([{field:field,reason:"invalid",...driveParams,message:error.message,params:{field:field,reason:"invalid",...driveParams}}])}}return completeResult(value)}jumpRangeSummary(){const maximum=this.#require(this.standardLoadResult("maximum"),"maximum load");const unladen=this.#require(this.standardLoadResult("unladen"),"unladen load");const laden=this.#require(this.standardLoadResult("laden"),"laden load");return{max:this.jumpRange(maximum),unladen:this.jumpRange(unladen),laden:this.jumpRange(laden),totalMax:this.totalRange(maximum),totalUnladen:this.totalRange(unladen),totalLaden:this.totalRange(laden)}}powerBudget(){const modules=[...this.#modules.values()];const consumers=[];for(const module of modules){const consumer=powerConsumerFor(module,this.#statsFor(module));if(consumer)consumers.push(consumer)}return powerBudget(powerAvailable(modules,module=>this.#statsFor(module)),consumers)}heatMetrics(){const input=heatInputFor(this.#ship,this.#modulesForEffectiveStats(),this.powerBudget(),module=>this.#statsFor(module));return input?heatMetrics(input):null}mobilityMetrics(options={}){requireEnginesPips("ShipLoadout.mobilityMetrics",options.enginesPips??4);requireLoadOptions("ShipLoadout.mobilityMetrics",options);return this.mobilityMetricsResult(options).value}mobilityMetricsResult(options={}){const enginesPips=requireEnginesPips("ShipLoadout.mobilityMetricsResult",options.enginesPips??4);requireLoadOptions("ShipLoadout.mobilityMetricsResult",options);const input=mobilityInputResultFor(this.#ship,[...this.#modules.values()],()=>this.powerBudget(),()=>{const main=options.fuel??this.#top.FuelCapacity?.Main??this.fuelCapacity.main;return this.#requireMass(options.cargo??0)+main},enginesPips,module=>this.#statsFor(module));if(!input.complete)return input;return completeResult(mobilityMetrics(input.value))}shieldMetrics(options={}){requireSystemsPips("ShipLoadout.shieldMetrics",options.systemsPips??0);return this.shieldMetricsResult(options).value}shieldMetricsResult(options={}){const systemsPips=requireSystemsPips("ShipLoadout.shieldMetricsResult",options.systemsPips??0);const input=shieldInputResultFor(this.#ship,[...this.#modules.values()],()=>this.powerBudget(),systemsPips,module=>this.#statsFor(module));if(!input.complete)return input;return completeResult(shieldMetrics(input.value))}shieldRecovery(options={}){requireSystemsPips("ShipLoadout.shieldRecovery",options.systemsPips??4);return this.shieldRecoveryResult(options).value}shieldRecoveryResult(options={}){const systemsPips=requireSystemsPips("ShipLoadout.shieldRecoveryResult",options.systemsPips??4);const input=shieldRecoveryInputResultFor(this.#ship,[...this.#modules.values()],()=>this.powerBudget(),systemsPips,module=>this.#statsFor(module));if(!input.complete)return input;return completeResult(shieldRecovery(input.value))}cellBanks(){const modules=[...this.#modules.values()];const banks=orderBySlotLayout(cellBankInputsFor(modules,this.powerBudget(),module=>this.#statsFor(module)),this.#layout(),bank=>bank.slot);return cellBankSummary(banks)}retailCredits(){const hull=this.#ship.hullCost;let modules=0;const unpriced=[];for(const module of this.#modules.values()){const stats=this.#statsFor(module);if(stats?.cost!==void 0){modules+=stats.cost}else if(stats!==null||!isNonOutfittingSlot(module.Slot)&&!isBuiltInHullModule(module)){unpriced.push({slot:module.Slot,symbol:module.Item})}}return deepFreeze({hull:hull,modules:modules,rebuy:Math.trunc((hull+modules)*.05),unpriced:unpriced})}mercCoinCost(){let total=0;for(const slotKey of this.#modules.keys()){total+=this.fittedModuleAt(slotKey)?.preEngineeredVariant?.mercCoinCost??0}return total}armourMetrics(){return armourMetrics(armourInputFor(this.#ship,[...this.#modules.values()],module=>this.#statsFor(module)))}weaponMetrics(){const weapons=[];for(const module of this.#modules.values()){const record=this.#statsFor(module);const stats=weaponStatsFor(this.#moduleForEffectiveStats(module),record);if(!stats)continue;weapons.push({slot:module.Slot,symbol:module.Item,name:record?.name??module.Item,enabled:module.On!==false,metrics:weaponMetrics(stats),ammunition:ammunitionCapacity(stats),...stats.maximumRange===void 0?{}:{maximumRange:stats.maximumRange},...stats.falloffRange===void 0?{}:{falloffRange:stats.falloffRange},...stats.projectileRange===void 0?{}:{projectileRange:{...stats.projectileRange}},...stats.armourPiercing===void 0?{}:{armourPiercing:stats.armourPiercing}})}const orderedWeapons=orderBySlotLayout(weapons,this.#layout(),weapon=>weapon.slot);return{weapons:orderedWeapons,total:sumWeaponMetrics(orderedWeapons.filter(weapon=>weapon.enabled).map(weapon=>weapon.metrics))}}weaponsCapacitorMetrics(options={}){const weaponsPips=options.weaponsPips??4;if(!Number.isFinite(weaponsPips)||weaponsPips<0||weaponsPips>4){throw new RangeError("ShipLoadout.weaponsCapacitorMetrics: weaponsPips must be a finite number from 0 to 4")}return weaponsCapacitorMetrics(weaponsCapacitorInputFor(this.#modulesForEffectiveStats(),weaponsPips,this.powerBudget(),module=>this.#statsFor(module)))}distributorMetrics(options={}){const pips={systemsPips:options.systemsPips??4,enginesPips:options.enginesPips??4,weaponsPips:options.weaponsPips??4};for(const field of["systemsPips","enginesPips","weaponsPips"]){const value=pips[field];if(!Number.isFinite(value)||value<0||value>4){throw new RangeError(`ShipLoadout.distributorMetrics: ${field} must be a finite number from 0 to 4`)}}const input=distributorInputFor(this.#modulesForEffectiveStats(),pips,this.powerBudget(),module=>this.#statsFor(module));return input?distributorMetrics(input):null}#layout(){if(this.#layoutCache===void 0){this.#layoutCache=Object.freeze(enumerateSlots(this.#ship))}return this.#layoutCache}#requireSlot(slotKey){const wanted=requireString(slotKey,SLOT_KEY).toLowerCase();const slot=this.#layout().find(s=>s.key.toLowerCase()===wanted);if(!slot){throw new RangeError(`ShipLoadout: hull "${truncate(this.#shipSymbol)}" has no slot "${truncate(slotKey)}"`)}return slot}#fittedKey(slotKey){return matchingKeyIn(this.#modules,requireString(slotKey,SLOT_KEY))}#fittedModuleFor(slotKey){const key=this.#fittedKey(slotKey);return key===null?void 0:this.#modules.get(key)}#require(result,what){if(result.value===null){throw new TypeError(`ShipLoadout: cannot determine ${what} (${result.issues.map(i=>i.message).join("; ")})`)}return result.value}#requireMass(cargo){return this.unladenMass+cargo}#calculationModules(){return[...this.#modules.values()].map(module=>({mass:this.#moduleMass(module),cargoCapacity:this.#moduleCapacity(module,"CargoCapacity","cargoCapacity"),fuelCapacity:this.#moduleCapacity(module,"FuelCapacity","fuelCapacity")}))}#moduleLimits(){const entries=[...this.#modules.values()].flatMap(module=>{const stats=this.#statsFor(module);return stats===null?[]:[stats]});return calculateModuleLimits(entries)}#moduleStatsAt(slotKey){const fitted=this.#fittedModuleFor(slotKey);return fitted===void 0?null:this.#statsFor(fitted)}#engineeringBaseStats(module){const fitted=this.#statsFor(module);if(!module.Engineering||identifyPreEngineeredVariant(module)===null)return fitted;const stock=builtInModuleBySymbol(module.Item,FITTED_ITEM);if(!stock)return fitted;return fitted?.engineeringLocked?cloneModuleStats({...stock,engineeringLocked:true}):stock}#moduleForEffectiveStats(module){const modifiers=this.#primitiveModifiers.get(module.Slot);if(modifiers===void 0||module.Engineering===void 0)return module;return{...module,Engineering:{...module.Engineering,Modifiers:modifiers}}}#modulesForEffectiveStats(){return[...this.#modules.values()].map(module=>this.#moduleForEffectiveStats(module))}#moduleLimitRegression(slotKey,replacement,current=this.#moduleLimits(),previous=this.#moduleStatsAt(slotKey)){if(previous?.limitGroup===void 0&&previous?.limitIncrease===void 0&&replacement?.limitGroup===void 0&&replacement?.limitIncrease===void 0){return null}for(const usage of current){const count=usage.count-Number(previous?.limitGroup===usage.group)+Number(replacement?.limitGroup===usage.group);const increase=usage.increase-(previous?.limitIncrease?.group===usage.group?previous.limitIncrease.amount:0)+(replacement?.limitIncrease?.group===usage.group?replacement.limitIncrease.amount:0);const limit=usage.baseLimit+increase;const excess=Math.max(0,count-limit);if(excess>usage.excess){return{...usage,increase:increase,limit:limit,count:count,excess:excess}}}return null}#replaceModule(slotKey,replacement,replacementStats,primitiveModifiers){const previous=this.#modules.get(slotKey)??null;this.#adjustImportedFigures(previous,replacement,replacementStats);if(replacement===null){this.#modules.delete(slotKey);this.#moduleStats.delete(slotKey);this.#primitiveModifiers.delete(slotKey)}else{this.#modules.set(slotKey,cloneLoadoutModule(replacement));if(replacementStats!==void 0)this.#moduleStats.set(slotKey,replacementStats);if(primitiveModifiers===void 0)this.#primitiveModifiers.delete(slotKey);else this.#primitiveModifiers.set(slotKey,primitiveModifiers)}this.#slotCache.clear()}#adjustImportedFigures(previous,next,nextStats){if(this.#top.UnladenMass!==void 0){this.#top.UnladenMass+=this.#moduleMass(next,nextStats)-this.#moduleMass(previous)}if(this.#top.CargoCapacity!==void 0){this.#top.CargoCapacity+=this.#moduleCapacity(next,"CargoCapacity","cargoCapacity",nextStats)-this.#moduleCapacity(previous,"CargoCapacity","cargoCapacity")}if(this.#top.FuelCapacity?.Main!==void 0){const reserve=this.#top.FuelCapacity.Reserve;this.#top.FuelCapacity={Main:this.#top.FuelCapacity.Main+this.#moduleCapacity(next,"FuelCapacity","fuelCapacity",nextStats)-this.#moduleCapacity(previous,"FuelCapacity","fuelCapacity"),...reserve===void 0?{}:{Reserve:reserve}}}if(normalizeKey(previous?.Item,FITTED_ITEM)===normalizeKey(next?.Item,FITTED_ITEM)){return}if(previous!==null&&isCargoHatchSlot(previous.Slot)||next!==null&&isCargoHatchSlot(next.Slot)){return}delete this.#top.ModulesValue;delete this.#top.Rebuy}#moduleMass(module,statsOverride){if(module===null)return 0;if(isCargoHatchSlot(module.Slot))return 0;const modified=getLoadoutModifier(module,"Mass");if(modified!==null)return modified;return(statsOverride??this.#statsFor(module))?.mass??0}#moduleCapacity(module,modifierLabel,field,statsOverride){if(module===null)return 0;if(isCargoHatchSlot(module.Slot))return 0;const modified=getLoadoutModifier(module,modifierLabel);if(modified!==null)return modified;return(statsOverride??this.#statsFor(module))?.[field]??0}#frameShiftDrive(){for(const m of this.#modules.values()){const stats=this.#statsFor(m);if(stats?.slot==="frameShiftDrive")return{module:m,stats:stats}}return void 0}#resolveDrive(){const fsd=this.#frameShiftDrive();if(!fsd)return null;const{module:fsdModule,stats:base}=fsd;if(base.fuelMul===void 0||base.fuelPower===void 0){throw new TypeError(`ShipLoadout: the fitted record for frame shift drive "${truncate(fsdModule.Item)}" has no jump constants`)}const optMass=getLoadoutModifier(fsdModule,"FSDOptimalMass")??base.optMass;const maxFuel=getLoadoutModifier(fsdModule,"MaxFuelPerJump")??base.maxFuel;if(optMass===void 0||maxFuel===void 0){const missing=[...optMass===void 0?["optMass"]:[],...maxFuel===void 0?["maxFuel"]:[]];throw new TypeError(`ShipLoadout: the fitted record for frame shift drive "${truncate(fsdModule.Item)}" has no ${missing.join(" or ")}`)}return{optMass:optMass,maxFuel:maxFuel,fuelMul:base.fuelMul,fuelPower:base.fuelPower,jumpBoost:this.#resolveJumpBoost()}}#resolveJumpBoost(){for(const m of this.#modules.values()){const stats=this.#statsFor(m);if(stats?.engineeringGroup!=="fsdBoosters"&&(stats?.jumpBoost===void 0||stats.jumpBoost===0)){continue}if(m.On===false)continue;if(stats?.jumpBoost===void 0){throw new TypeError(`ShipLoadout: the fitted record for FSD booster "${truncate(m.Item)}" has no jumpBoost`)}return stats.jumpBoost}return 0}#statsFor(module){if(module===null)return null;const stats=this.#moduleStats.get(module.Slot)??builtInModuleBySymbol(module.Item,FITTED_ITEM);if(stats)return stats;return isBuiltInHullModule(module)?builtInModuleBySymbol("ModularCargoBayDoor","ShipLoadout: built-in module"):null}};export{LoadoutEditError,ShipLoadout};//# sourceMappingURL=chunk-XULHGGG4.js.map