@archivist-gg/dnd5e 0.3.11 → 0.3.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSES/SRD.md +38 -3
- package/dist/armor/armor.codec.js +3 -3
- package/dist/armor/armor.parser.js +2 -2
- package/dist/armor/armor.schema.d.ts +1 -0
- package/dist/armor/armor.schema.js +1 -1
- package/dist/armor/armor.types.d.ts +2 -0
- package/dist/background/background.codec.js +5 -5
- package/dist/background/background.parser.js +4 -4
- package/dist/background/background.schema.js +3 -3
- package/dist/{chunk-XTRDCSJB.js → chunk-2JSQE3DD.js} +15 -1
- package/dist/chunk-2LULMQTF.js +14 -0
- package/dist/{chunk-MAH6DCRI.js → chunk-2UDSN6VW.js} +1 -1
- package/dist/chunk-3LWMFYKS.js +57 -0
- package/dist/{chunk-JCEV7KYN.js → chunk-3MGQFFNE.js} +1 -1
- package/dist/chunk-3VZZDKRA.js +1014 -0
- package/dist/{chunk-2DFENQIJ.js → chunk-5GKJAUMX.js} +2 -0
- package/dist/{chunk-2M34FLAY.js → chunk-5MXFW4O3.js} +9 -3
- package/dist/{chunk-4DOMDEBZ.js → chunk-6EI737IO.js} +1 -1
- package/dist/{chunk-G247QXWW.js → chunk-7ATNGKBS.js} +1 -1
- package/dist/{chunk-XY6X2APM.js → chunk-7Q2VPKCD.js} +17 -0
- package/dist/{chunk-T2SNEJOE.js → chunk-7QN7XSAK.js} +1 -1
- package/dist/{chunk-DNAJRMNN.js → chunk-A54HHCWW.js} +6 -7
- package/dist/{chunk-7YU4NPKR.js → chunk-AZRGFUSR.js} +1 -1
- package/dist/{chunk-PP2UHLBA.js → chunk-B3DP42OM.js} +5 -0
- package/dist/chunk-CM5CWO4K.js +735 -0
- package/dist/{chunk-MQ747UCR.js → chunk-DOXSFYLH.js} +70 -2
- package/dist/chunk-EJP263OP.js +186 -0
- package/dist/{chunk-SMLXZUBH.js → chunk-EYX4JMAU.js} +4 -1
- package/dist/{chunk-V6LJFP4R.js → chunk-FANQVQ3D.js} +2 -2
- package/dist/{chunk-AW3EHF3L.js → chunk-FC4IGH5Y.js} +1 -1
- package/dist/{chunk-23LZLBJK.js → chunk-G6MHJDVT.js} +6 -2
- package/dist/{chunk-JANNRGJC.js → chunk-G6PBI2BU.js} +1 -1
- package/dist/chunk-H5PTKYXL.js +101 -0
- package/dist/{chunk-LWFTHJIE.js → chunk-HHBD4SQ6.js} +1 -1
- package/dist/{chunk-JC5UNIVM.js → chunk-HS6FIOLP.js} +2 -0
- package/dist/chunk-HTYMW5CH.js +228 -0
- package/dist/chunk-IHE6KVC3.js +13 -0
- package/dist/{chunk-QHMWA3SZ.js → chunk-JCMUVZIK.js} +1 -1
- package/dist/{chunk-V373TRJE.js → chunk-JSM6JFZR.js} +198 -125
- package/dist/{chunk-LDDCNPHD.js → chunk-K5NJBTE2.js} +1 -1
- package/dist/chunk-KR6JF3BF.js +14 -0
- package/dist/{chunk-4ISR76DH.js → chunk-KSTV7J2U.js} +9 -3
- package/dist/chunk-LBEXLN6I.js +91 -0
- package/dist/{chunk-BLRW2UU6.js → chunk-LF5AGJA4.js} +2 -2
- package/dist/{chunk-UBBKSYBY.js → chunk-LHZXYFBU.js} +30 -1
- package/dist/{chunk-BIA32MQ5.js → chunk-MBX25B6D.js} +1 -1
- package/dist/{chunk-R2ZV233X.js → chunk-MYY2C5MB.js} +3 -3
- package/dist/{chunk-J77CKYV3.js → chunk-OFCSP6MT.js} +1 -1
- package/dist/{chunk-2INMRR3Q.js → chunk-ONTGZR5T.js} +326 -149
- package/dist/{chunk-MWCCGPG3.js → chunk-OOSRUJBI.js} +3 -2
- package/dist/{chunk-U3BABVJF.js → chunk-PKX6TGRE.js} +2 -2
- package/dist/{chunk-PJMG5XV3.js → chunk-PQZ4LM4Z.js} +1 -1
- package/dist/chunk-PXVNAY7T.js +84 -0
- package/dist/chunk-QH36K2PU.js +158 -0
- package/dist/{chunk-R747YKS7.js → chunk-QZSWN2KT.js} +1 -1
- package/dist/{chunk-CHUALUIX.js → chunk-RYLXAYIQ.js} +1 -1
- package/dist/{chunk-GFZ7PITJ.js → chunk-S3YUXDSC.js} +6 -1
- package/dist/{chunk-PZCE7DJM.js → chunk-T6QIF5XR.js} +31 -1
- package/dist/{chunk-CBEKVAX4.js → chunk-TULQ4FFX.js} +41 -13
- package/dist/{chunk-S56D6B6C.js → chunk-UUBJCNQU.js} +12 -3
- package/dist/{chunk-5N2GW72F.js → chunk-UZXG6QSY.js} +2 -1
- package/dist/{chunk-4XTNPNQB.js → chunk-VPYBK2MG.js} +1 -1
- package/dist/{chunk-3HX5VLWP.js → chunk-VRV3NNTA.js} +2 -2
- package/dist/{chunk-HZA7OE7N.js → chunk-XCFC7LGF.js} +2 -1
- package/dist/{chunk-BL3VELKP.js → chunk-Y5VVP73C.js} +1 -1
- package/dist/{chunk-PI4LLJG4.js → chunk-YD2VAHA6.js} +2 -2
- package/dist/{chunk-UIRMA5KM.js → chunk-YDGMBMYI.js} +1 -1
- package/dist/{chunk-NWDF5HG3.js → chunk-YKL6SHRJ.js} +1 -1
- package/dist/{chunk-6X4KUDMU.js → chunk-ZCTUYGNV.js} +7 -2
- package/dist/chunk-ZUQW5VBZ.js +89 -0
- package/dist/class/class.codec.js +7 -7
- package/dist/class/class.parser.js +6 -6
- package/dist/class/class.schema.d.ts +18 -0
- package/dist/class/class.schema.js +5 -5
- package/dist/class/class.standard-array.d.ts +16 -0
- package/dist/class/class.standard-array.js +20 -0
- package/dist/class/class.types.d.ts +3 -0
- package/dist/dnd/amount-text.d.ts +38 -0
- package/dist/dnd/amount-text.js +13 -0
- package/dist/dnd/resource-words.d.ts +4 -0
- package/dist/dnd/resource-words.js +30 -0
- package/dist/entities/base-item-resolver.js +2 -2
- package/dist/entities/slug.d.ts +18 -8
- package/dist/entities/slug.js +3 -1
- package/dist/feat/feat.codec.js +5 -5
- package/dist/feat/feat.parser.js +4 -4
- package/dist/feat/feat.schema.d.ts +41 -3
- package/dist/feat/feat.schema.js +3 -3
- package/dist/index.js +7513 -4177
- package/dist/item/item.actions-map.d.ts +40 -5
- package/dist/item/item.actions-map.js +5 -84
- package/dist/item/item.attunement.js +3 -9
- package/dist/item/item.bonuses.js +5 -2
- package/dist/item/item.codec.js +3 -3
- package/dist/item/item.conditions.js +4 -1
- package/dist/item/item.conditions.types.d.ts +4 -0
- package/dist/item/item.cost.d.ts +3 -0
- package/dist/item/item.cost.js +29 -0
- package/dist/item/item.icon.d.ts +15 -0
- package/dist/item/item.icon.js +211 -0
- package/dist/item/item.parser.js +2 -2
- package/dist/item/item.schema.d.ts +16 -1
- package/dist/item/item.schema.js +3 -1
- package/dist/item/item.types.d.ts +9 -2
- package/dist/monster/monster.parser.js +5 -5
- package/dist/monster/monster.schema.js +4 -4
- package/dist/optional-feature/optional-feature.codec.js +5 -4
- package/dist/optional-feature/optional-feature.parser.js +4 -3
- package/dist/optional-feature/optional-feature.schema.d.ts +255 -3
- package/dist/optional-feature/optional-feature.schema.js +7 -2
- package/dist/pc/pc.additional-spells.js +3 -3
- package/dist/pc/pc.amount-bindings.d.ts +32 -0
- package/dist/pc/pc.amount-bindings.js +23 -0
- package/dist/pc/pc.asi-flatten.d.ts +62 -1
- package/dist/pc/pc.asi-flatten.js +16 -0
- package/dist/pc/pc.conditions.js +1 -1
- package/dist/pc/pc.containment.d.ts +45 -0
- package/dist/pc/pc.containment.js +24 -0
- package/dist/pc/pc.decision-engine.d.ts +24 -3
- package/dist/pc/pc.decision-engine.js +26 -16
- package/dist/pc/pc.entry-overrides.d.ts +79 -0
- package/dist/pc/pc.entry-overrides.js +40 -0
- package/dist/pc/pc.equipment.d.ts +2 -2
- package/dist/pc/pc.equipment.js +19 -7
- package/dist/pc/pc.feature-effects.d.ts +12 -0
- package/dist/pc/pc.feature-effects.js +2 -2
- package/dist/pc/pc.infusions.d.ts +228 -0
- package/dist/pc/pc.infusions.js +64 -0
- package/dist/pc/pc.member-choices.d.ts +90 -0
- package/dist/pc/pc.member-choices.js +32 -0
- package/dist/pc/pc.parser.js +18 -1
- package/dist/pc/pc.pools.d.ts +8 -1
- package/dist/pc/pc.pools.js +13 -3
- package/dist/pc/pc.proficiencies.js +23 -15
- package/dist/pc/pc.proficiency-query.js +6 -0
- package/dist/pc/pc.recalc.d.ts +39 -36
- package/dist/pc/pc.recalc.js +115 -70
- package/dist/pc/pc.resolver.d.ts +2 -1
- package/dist/pc/pc.resolver.js +22 -14
- package/dist/pc/pc.resource-seed.js +1 -1
- package/dist/pc/pc.resources.d.ts +6 -1
- package/dist/pc/pc.resources.js +3 -1
- package/dist/pc/pc.rest.d.ts +21 -1
- package/dist/pc/pc.rest.js +52 -19
- package/dist/pc/pc.schema.d.ts +43 -2
- package/dist/pc/pc.schema.js +1 -1
- package/dist/pc/pc.slotting.d.ts +36 -3
- package/dist/pc/pc.slotting.js +13 -5
- package/dist/pc/pc.tool-picks.d.ts +51 -0
- package/dist/pc/pc.tool-picks.js +18 -0
- package/dist/pc/pc.types.d.ts +115 -14
- package/dist/pc/pc.weapon-grant.d.ts +15 -0
- package/dist/pc/pool-layout.d.ts +8 -0
- package/dist/pc/pool-layout.js +5 -3
- package/dist/pc/resource-equivalents.d.ts +44 -0
- package/dist/pc/spell-source.js +4 -9
- package/dist/race/race.codec.js +6 -6
- package/dist/race/race.parser.js +5 -5
- package/dist/race/race.schema.js +4 -4
- package/dist/schemas/attack-schema.d.ts +1 -1
- package/dist/schemas/choice-schema.js +2 -2
- package/dist/schemas/feature-effect-schema.d.ts +41 -3
- package/dist/schemas/feature-effect-schema.js +1 -1
- package/dist/schemas/feature-schema.js +3 -3
- package/dist/schemas/selection-pool-schema.d.ts +10 -0
- package/dist/schemas/selection-pool-schema.js +1 -1
- package/dist/spell/spell.codec.js +2 -2
- package/dist/spell/spell.parser.d.ts +6 -1
- package/dist/spell/spell.parser.js +5 -3
- package/dist/spell/spell.types.d.ts +10 -0
- package/dist/srd/retired-items.d.ts +14 -0
- package/dist/srd/retired-items.js +11 -0
- package/dist/subclass/subclass.codec.js +7 -7
- package/dist/subclass/subclass.parser.js +6 -6
- package/dist/subclass/subclass.schema.d.ts +10 -0
- package/dist/subclass/subclass.schema.js +5 -5
- package/dist/types/choice.d.ts +13 -0
- package/dist/types/equipment-grant.d.ts +18 -1
- package/dist/types/equipment-grant.js +12 -0
- package/dist/types/feature-effect.d.ts +12 -1
- package/dist/types/optional-feature.types.d.ts +84 -1
- package/dist/types/selection-pool.d.ts +18 -3
- package/dist/weapon/weapon.classify.d.ts +10 -8
- package/dist/weapon/weapon.classify.js +2 -2
- package/dist/weapon/weapon.codec.js +3 -3
- package/dist/weapon/weapon.parser.js +2 -2
- package/dist/weapon/weapon.schema.d.ts +1 -0
- package/dist/weapon/weapon.schema.js +1 -1
- package/dist/weapon/weapon.types.d.ts +2 -0
- package/package.json +1 -1
- package/dist/chunk-O4SRD3J5.js +0 -165
- package/dist/chunk-WXWPK3LI.js +0 -55
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import {
|
|
2
|
+
bareEntitySlug
|
|
3
|
+
} from "./chunk-ZCTUYGNV.js";
|
|
4
|
+
import {
|
|
5
|
+
ABILITY_KEYS
|
|
6
|
+
} from "./chunk-WELIKLZF.js";
|
|
7
|
+
|
|
8
|
+
// src/pc/pc.asi-flatten.ts
|
|
9
|
+
function flattenAsiOrFeat(choice) {
|
|
10
|
+
var _a;
|
|
11
|
+
if (choice.kind !== "select-inline" || choice.id !== "asi-or-feat") return choice;
|
|
12
|
+
const featBranches = choice.options.filter((o) => {
|
|
13
|
+
var _a2;
|
|
14
|
+
return ((_a2 = o.choices) != null ? _a2 : []).some((c) => c.kind === "select-entity" && c.entity_type === "feat");
|
|
15
|
+
});
|
|
16
|
+
if (featBranches.length !== 1) return choice;
|
|
17
|
+
const inner = (_a = featBranches[0].choices) != null ? _a : [];
|
|
18
|
+
if (inner.length !== 1) return choice;
|
|
19
|
+
const only = inner[0];
|
|
20
|
+
if (only.kind !== "select-entity" || only.entity_type !== "feat") return choice;
|
|
21
|
+
return only;
|
|
22
|
+
}
|
|
23
|
+
var ASI_FEAT_BARE = "ability-score-improvement";
|
|
24
|
+
function legacyAsiBranch(block) {
|
|
25
|
+
if (!block || typeof block !== "object") return null;
|
|
26
|
+
const b = block;
|
|
27
|
+
if (typeof b.feat === "string") return null;
|
|
28
|
+
const asi = b.asi;
|
|
29
|
+
if (!asi || typeof asi !== "object" || Array.isArray(asi)) return null;
|
|
30
|
+
const out = {};
|
|
31
|
+
let any = false;
|
|
32
|
+
for (const ab of ABILITY_KEYS) {
|
|
33
|
+
const v = asi[ab];
|
|
34
|
+
if (typeof v === "number") {
|
|
35
|
+
out[ab] = v;
|
|
36
|
+
any = true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return any ? out : null;
|
|
40
|
+
}
|
|
41
|
+
function convertibleLegacyAsi(block) {
|
|
42
|
+
const alloc = legacyAsiBranch(block);
|
|
43
|
+
if (!alloc) return null;
|
|
44
|
+
const branch = block["asi-or-feat"];
|
|
45
|
+
return branch === void 0 || branch === "asi" ? alloc : null;
|
|
46
|
+
}
|
|
47
|
+
function resolveLegacyAsiFeat(registry, classEntity) {
|
|
48
|
+
if (!classEntity) return null;
|
|
49
|
+
const prefix = classEntity.slug.split("_")[0];
|
|
50
|
+
const ranked = [];
|
|
51
|
+
for (const e of registry.search("", "feat", Number.POSITIVE_INFINITY)) {
|
|
52
|
+
if (bareEntitySlug(e.slug) !== ASI_FEAT_BARE) continue;
|
|
53
|
+
const data = e.data;
|
|
54
|
+
const choices = Array.isArray(data == null ? void 0 : data.choices) ? data.choices : [];
|
|
55
|
+
const points = choices.find((c) => (c == null ? void 0 : c.kind) === "ability-points" && typeof c.id === "string");
|
|
56
|
+
if (!points) continue;
|
|
57
|
+
ranked.push({
|
|
58
|
+
slug: e.slug,
|
|
59
|
+
childId: points.id,
|
|
60
|
+
prefixHit: e.slug.split("_")[0] === prefix,
|
|
61
|
+
editionHit: classEntity.edition !== void 0 && (data == null ? void 0 : data.edition) === classEntity.edition
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
ranked.sort((a, b) => Number(b.prefixHit) - Number(a.prefixHit) || Number(b.editionHit) - Number(a.editionHit) || (a.slug < b.slug ? -1 : a.slug > b.slug ? 1 : 0));
|
|
65
|
+
return ranked.length ? { slug: ranked[0].slug, childId: ranked[0].childId } : null;
|
|
66
|
+
}
|
|
67
|
+
function migrateLegacyAsiLevel(block, key, value, registry, classEntity) {
|
|
68
|
+
if (key !== "feat" && !key.startsWith("feat:")) return null;
|
|
69
|
+
const alloc = convertibleLegacyAsi(block);
|
|
70
|
+
if (!alloc) return null;
|
|
71
|
+
const asi = resolveLegacyAsiFeat(registry, classEntity);
|
|
72
|
+
if (!asi) return null;
|
|
73
|
+
const childKey = `feat:${asi.childId}`;
|
|
74
|
+
const isSwitch = key === "feat" && value !== asi.slug;
|
|
75
|
+
const out = {};
|
|
76
|
+
for (const [k, v] of Object.entries(block)) {
|
|
77
|
+
if (k === "asi-or-feat" || k === "asi" || k === childKey) continue;
|
|
78
|
+
out[k] = v;
|
|
79
|
+
}
|
|
80
|
+
out.feat = asi.slug;
|
|
81
|
+
if (!isSwitch) out[childKey] = alloc;
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export {
|
|
86
|
+
flattenAsiOrFeat,
|
|
87
|
+
legacyAsiBranch,
|
|
88
|
+
convertibleLegacyAsi,
|
|
89
|
+
resolveLegacyAsiFeat,
|
|
90
|
+
migrateLegacyAsiLevel
|
|
91
|
+
};
|
|
@@ -2,13 +2,13 @@ import {
|
|
|
2
2
|
poolGrantSchema,
|
|
3
3
|
selectionPoolSchema,
|
|
4
4
|
tabDeclSchema
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-G6MHJDVT.js";
|
|
6
6
|
import {
|
|
7
7
|
casterTypeEnum
|
|
8
8
|
} from "./chunk-CJYCVNW2.js";
|
|
9
9
|
import {
|
|
10
10
|
featureSchema
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-YD2VAHA6.js";
|
|
12
12
|
import {
|
|
13
13
|
resourceSchema
|
|
14
14
|
} from "./chunk-ZJXSXVFP.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveBaseItem
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CM5CWO4K.js";
|
|
4
4
|
|
|
5
5
|
// src/pc/pc.slotting.ts
|
|
6
6
|
function isItemEntity(e) {
|
|
@@ -38,6 +38,31 @@ function effectiveArmor(entity, registry) {
|
|
|
38
38
|
}
|
|
39
39
|
return null;
|
|
40
40
|
}
|
|
41
|
+
function effectiveWeapon(entity, registry) {
|
|
42
|
+
if (isWeaponEntity(entity)) return entity;
|
|
43
|
+
if (isItemEntity(entity) && typeof entity.base_item === "string") {
|
|
44
|
+
const base = resolveBaseItem(entity.base_item, registry);
|
|
45
|
+
if ((base == null ? void 0 : base.entityType) === "weapon" && isWeaponEntity(base.data)) return base.data;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
function isTwoHandedWeapon(entity, registry) {
|
|
50
|
+
if (!entity || typeof entity !== "object") return false;
|
|
51
|
+
const own = entity.properties;
|
|
52
|
+
if (Array.isArray(own) && own.length > 0) return own.some((p) => p === "two_handed");
|
|
53
|
+
if (!registry) return false;
|
|
54
|
+
const weapon = effectiveWeapon(entity, registry);
|
|
55
|
+
return !!weapon && Array.isArray(weapon.properties) && weapon.properties.some((p) => p === "two_handed");
|
|
56
|
+
}
|
|
57
|
+
function armorAcTerm(armor) {
|
|
58
|
+
var _a;
|
|
59
|
+
return armor.ac.base + ((_a = armor.ac.flat) != null ? _a : 0);
|
|
60
|
+
}
|
|
61
|
+
function slotAcTerms(armor, entry) {
|
|
62
|
+
var _a;
|
|
63
|
+
const bonus = (_a = entry == null ? void 0 : entry.overrides) == null ? void 0 : _a.ac_bonus;
|
|
64
|
+
return { armor: armor ? armorAcTerm(armor) : null, override: typeof bonus === "number" ? bonus : 0 };
|
|
65
|
+
}
|
|
41
66
|
function defaultSlotForType(entityType, entity, registry) {
|
|
42
67
|
if (entityType === "weapon") return "mainhand";
|
|
43
68
|
if (entityType === "armor") {
|
|
@@ -61,5 +86,9 @@ export {
|
|
|
61
86
|
resolveEntityForEntry,
|
|
62
87
|
isShieldArmor,
|
|
63
88
|
effectiveArmor,
|
|
89
|
+
effectiveWeapon,
|
|
90
|
+
isTwoHandedWeapon,
|
|
91
|
+
armorAcTerm,
|
|
92
|
+
slotAcTerms,
|
|
64
93
|
defaultSlotForType
|
|
65
94
|
};
|
|
@@ -132,7 +132,7 @@ var CONDITION_TOOLTIPS_2014 = {
|
|
|
132
132
|
paralyzed: [
|
|
133
133
|
"Incapacitated. Speed 0.",
|
|
134
134
|
"Auto-fail STR/DEX saves.",
|
|
135
|
-
"Attacks against have advantage; melee within
|
|
135
|
+
"Attacks against have advantage; melee within 5 ft. auto-crit."
|
|
136
136
|
],
|
|
137
137
|
petrified: [
|
|
138
138
|
"Incapacitated. Speed 0.",
|
|
@@ -141,7 +141,7 @@ var CONDITION_TOOLTIPS_2014 = {
|
|
|
141
141
|
],
|
|
142
142
|
poisoned: ["Disadvantage on attack rolls and ability checks."],
|
|
143
143
|
prone: [
|
|
144
|
-
"Attacks against within
|
|
144
|
+
"Attacks against within 5 ft. have advantage; beyond 5 ft. have disadvantage.",
|
|
145
145
|
"Your attacks have disadvantage."
|
|
146
146
|
],
|
|
147
147
|
restrained: [
|
|
@@ -155,7 +155,7 @@ var CONDITION_TOOLTIPS_2014 = {
|
|
|
155
155
|
unconscious: [
|
|
156
156
|
"Incapacitated, prone, dropped held items. Speed 0.",
|
|
157
157
|
"Auto-fail STR/DEX saves.",
|
|
158
|
-
"Attacks against have advantage; melee within
|
|
158
|
+
"Attacks against have advantage; melee within 5 ft. auto-crit."
|
|
159
159
|
]
|
|
160
160
|
};
|
|
161
161
|
var CONDITION_TOOLTIPS_2024 = {
|