@kaiord/fit 7.1.1 → 9.0.0
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/dist/index.js +532 -43
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/shared/message-numbers.ts","../src/adapters/schemas/fit-file-type.ts","../src/adapters/schemas/fit-sub-sport.ts","../src/adapters/sub-sport/sub-sport.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-metadata.mapper.ts","../src/adapters/schemas/fit-duration.ts","../src/adapters/schemas/fit-target.ts","../src/adapters/schemas/fit-equipment.ts","../src/adapters/equipment/equipment.mapper.ts","../src/adapters/krd-to-fit/duration-converters/conditional.ts","../src/adapters/krd-to-fit/duration-converters/repeat.ts","../src/adapters/krd-to-fit/duration-converters/repeat-hr-power.ts","../src/adapters/krd-to-fit/duration-converters/simple.ts","../src/adapters/krd-to-fit/krd-to-fit-duration.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-target-cadence.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-target-heart-rate.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-target-pace.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-target-power.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-target-stroke.converter.ts","../src/adapters/krd-to-fit/krd-to-fit-target.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-step.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-workout.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit.converter.ts","../src/adapters/shared/coordinate.converter.ts","../src/adapters/schemas/fit-message-keys.ts","../src/adapters/event/event-type-maps.ts","../src/adapters/event/event.mapper.ts","../src/adapters/schemas/fit-event.ts","../src/adapters/event/fit-to-krd-event.converter.ts","../src/adapters/extensions/developer-fields.extractor.ts","../src/adapters/extensions/extensions.extractor.ts","../src/adapters/schemas/fit-lap-trigger.ts","../src/adapters/schemas/fit-sport.ts","../src/adapters/schemas/fit-lap.ts","../src/adapters/lap/lap-trigger.mapper.ts","../src/adapters/lap/fit-to-krd-lap.mapper.ts","../src/adapters/lap/fit-to-krd-lap.converter.ts","../src/adapters/schemas/fit-record.ts","../src/adapters/record/record-from-fit.mapper.ts","../src/adapters/record/fit-to-krd-record.converter.ts","../src/adapters/schemas/fit-session.ts","../src/adapters/session/session.mapper.ts","../src/adapters/session/fit-to-krd-session.converter.ts","../src/adapters/messages/activity.mapper.ts","../src/adapters/shared/type-guards.ts","../src/adapters/metadata/metadata.mapper.ts","../src/adapters/length-unit/length-unit.mapper.ts","../src/adapters/duration/duration-converters.ts","../src/adapters/duration/repeat-duration-converters.ts","../src/adapters/duration/duration.converter.ts","../src/adapters/duration/duration.mapper.ts","../src/adapters/target/target-cadence.converter.ts","../src/adapters/target/target-heart-rate.converter.ts","../src/adapters/target/target-pace.converter.ts","../src/adapters/target/power-helpers.ts","../src/adapters/target/target-power.converter.ts","../src/adapters/target/target-stroke.converter.ts","../src/adapters/target/target.converter.ts","../src/adapters/target/target.mapper.ts","../src/adapters/workout/step.mapper.ts","../src/adapters/workout/repetition.builder.ts","../src/adapters/workout/workout.mapper.ts","../src/adapters/messages/messages.validator.ts","../src/adapters/messages/workout.mapper.ts","../src/adapters/messages/messages.mapper.ts","../src/adapters/garmin-fitsdk.ts","../src/index.ts"],"names":["z","durationTypeSchema","targetTypeSchema","targetUnitSchema","isRepetitionBlock","createFitParsingError","convertCadenceTarget","convertHeartRateTarget","convertPaceTarget","convertPowerTarget","KRD_VERSION","fileTypeSchema"],"mappings":";;;;;;;AAKO,IAAM,mBAAA,GAAsB;AAAA,EACjC,OAAA,EAAS,CAAA;AAAA,EACT,OAAA,EAAS,EAAA;AAAA,EACT,YAAA,EAAc;AAChB,CAAA;ACCiC,EAAE,IAAA,CAAK;AAAA,EACtC,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC;AAYM,IAAM,uBAAA,GAAuD;AAAA,EAClE,MAAA,EAAQ,CAAA;AAAA,EACR,QAAA,EAAU,CAAA;AAAA,EACV,KAAA,EAAO,CAAA;AAAA,EACP,QAAA,EAAU,CAAA;AAAA,EACV,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,CAAA;AAAA,EACR,SAAA,EAAW,CAAA;AAAA,EACX,MAAA,EAAQ,CAAA;AAAA,EACR,MAAA,EAAQ,EAAA;AAAA,EACR,KAAA,EAAO,EAAA;AAAA,EACP,aAAA,EAAe,EAAA;AAAA,EACf,WAAA,EAAa,EAAA;AAAA,EACb,eAAA,EAAiB,EAAA;AAAA,EACjB,eAAA,EAAiB,EAAA;AAAA,EACjB,WAAA,EAAa,EAAA;AAAA,EACb,OAAA,EAAS,EAAA;AAAA,EACT,WAAA,EAAa,EAAA;AAAA,EACb,gBAAA,EAAkB;AACpB,CAAA;AC1DO,IAAM,iBAAA,GAAoBA,EAAE,IAAA,CAAK;AAAA,EACtC,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,qBAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,sBAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC,CAAA;;;AC5DD,IAAM,wBAAA,GAA0D;AAAA,EAC9D,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,aAAA,EAAe,gBAAA;AAAA,EACf,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,cAAA;AAAA,EACb,YAAA,EAAc,eAAA;AAAA,EACd,YAAA,EAAc,eAAA;AAAA,EACd,UAAA,EAAY,YAAA;AAAA,EACZ,aAAA,EAAe,gBAAA;AAAA,EACf,WAAA,EAAa,cAAA;AAAA,EACb,SAAA,EAAW,YAAA;AAAA,EACX,mBAAA,EAAqB,sBAAA;AAAA,EACrB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,eAAA;AAAA,EACd,cAAA,EAAgB,iBAAA;AAAA,EAChB,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,gBAAA;AAAA,EACd,GAAA,EAAK,KAAA;AAAA,EACL,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,mBAAA,EAAqB,wBAAA;AAAA,EACrB,mBAAA,EAAqB,wBAAA;AAAA,EACrB,oBAAA,EAAsB,yBAAA;AAAA,EACtB,GAAA,EAAK,KAAA;AAAA,EACL,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,UAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,cAAA;AAAA,EACb,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,aAAA,EAAe,gBAAA;AAAA,EACf,aAAA,EAAe,gBAAA;AAAA,EACf,aAAA,EAAe,iBAAA;AAAA,EACf,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,eAAA;AAAA,EACd,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,UAAA;AAAA,EACT,GAAA,EAAK,KAAA;AAAA,EACL,eAAA,EAAiB,mBAAA;AAAA,EACjB,cAAA,EAAgB,kBAAA;AAAA,EAChB,WAAA,EAAa,cAAA;AAAA,EACb,WAAA,EAAa,cAAA;AAAA,EACb,YAAA,EAAc,eAAA;AAAA,EACd,eAAA,EAAiB,kBAAA;AAAA,EACjB,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,2BACJ,MAAA,CAAO,WAAA;AAAA,EACL,MAAA,CAAO,OAAA,CAAQ,wBAAwB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,GAAG,CAAA,KAAM,CAAC,GAAA,EAAK,GAAG,CAAC;AACzE,CAAA;AAEK,IAAM,gBAAA,GAAmB,CAAC,WAAA,KAAmC;AAClE,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,SAAA,CAAU,WAAW,CAAA;AAEtD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,eAAe,IAAA,CAAK,OAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,wBAAA,CAAyB,MAAA,CAAO,IAAI,CAAA,IAAK,eAAe,IAAA,CAAK,OAAA;AACtE,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,WAAA,KAAsC;AACrE,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,SAAA,CAAU,WAAW,CAAA;AAEnD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,kBAAkB,IAAA,CAAK,OAAA;AAAA,EAChC;AAEA,EAAA,OACE,wBAAA,CAAyB,MAAA,CAAO,IAAI,CAAA,IAAK,kBAAkB,IAAA,CAAK,OAAA;AAEpE,CAAA;;;ACpFA,IAAM,oBAAA,GAAuB,QAAA;AAM7B,IAAM,eAAA,GAAkB,CACtB,YAAA,EACA,MAAA,KACW;AACX,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,oBAAA;AAAA,EACT;AAEA,EAAA,MAAM,gBAAA,GAAmB,QAAQ,KAAA,CAAM,YAAA;AACvC,EAAA,MAAM,kBAAA,GAAqB,MAAA,CAAO,MAAA,CAAO,gBAAgB,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,aAAa,WAAA,EAAY;AAE5C,EAAA,MAAM,UAAU,kBAAA,CAAmB,IAAA;AAAA,IACjC,CAAC,KAAA,KACC,KAAA,CAAM,WAAA,EAAY,KAAM,cACxB,KAAA,CAAM,WAAA,EAAY,CAAE,UAAA,CAAW,UAAU,CAAA,IACzC,UAAA,CAAW,UAAA,CAAW,KAAA,CAAM,aAAa;AAAA,GAC7C;AAEA,EAAA,IAAI,SAAS,OAAO,OAAA;AAEpB,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,CAAA,sBAAA,EAAyB,YAAY,CAAA,mBAAA,EAAsB,oBAAoB,CAAA,CAAA,CAAA;AAAA,IAC/E,EAAE,QAAA,EAAU,YAAA,EAAc,QAAA,EAAU,oBAAA;AAAqB,GAC3D;AACA,EAAA,OAAO,oBAAA;AACT,CAAA;AAEO,IAAM,uBAAA,GAA0B,CACrC,GAAA,EACA,MAAA,KAC4B;AAC5B,EAAA,MAAA,CAAO,MAAM,wCAAwC,CAAA;AAErD,EAAA,MAAM,QAAA,GACJ,GAAA,CAAI,IAAA,KAAS,oBAAA,GACT,SAAA,GACA,GAAA,CAAI,IAAA,KAAS,mBAAA,GACX,UAAA,GACA,GAAA,CAAI,IAAA,KAAS,QAAA,GACX,QAAA,GACA,SAAA;AAEV,EAAA,MAAM,MAAA,GAAkC;AAAA,IACtC,IAAA,EAAM,uBAAA,CAAwB,QAAQ,CAAA,IAAK,uBAAA,CAAwB,OAAA;AAAA,IACnE,WAAA,EAAa,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,OAAO,CAAA;AAAA,IAC1C,YAAA,EAAc,eAAA,CAAgB,GAAA,CAAI,QAAA,CAAS,cAAc,MAAM;AAAA,GACjE;AAEA,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,OAAA,KAAY,MAAA,EAAW;AACtC,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,SAAS,EAAE,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,CAAM,aAAa,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,OAAA,GAAU,aAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAC7B,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,cAAc,EAAE,CAAA;AAC3D,IAAA,IAAI,CAAC,KAAA,CAAM,YAAY,CAAA,EAAG;AACxB,MAAA,MAAA,CAAO,YAAA,GAAe,YAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAEO,IAAM,sBAAA,GAAyB,CACpC,OAAA,EACA,MAAA,KAC4B;AAC5B,EAAA,MAAA,CAAO,MAAM,6BAA6B,CAAA;AAE1C,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,OAAA,CAAQ,KAAK,CAAA;AAEnD,EAAA,MAAM,WAAA,GAAuC;AAAA,IAC3C,SAAS,OAAA,CAAQ,IAAA;AAAA,IACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf;AAAA,GACF;AAEA,EAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,IAAA,WAAA,CAAY,QAAA,GAAW,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAW;AACpC,IAAA,WAAA,CAAY,aAAa,OAAA,CAAQ,UAAA;AACjC,IAAA,WAAA,CAAY,cAAA,GAAiB,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,WAAA;AACT,CAAA;AAEA,IAAM,eAAA,GAAkB,CACtB,KAAA,KACW;AACX,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC3B,MAAA,KAAA,IAAS,IAAA,CAAK,MAAM,MAAA,GAAS,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,KAAA,IAAS,CAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT,CAAA;ACrHO,IAAM,qBAAA,GAAwBA,EAAE,IAAA,CAAK;AAAA,EAC1C,MAAA;AAAA,EACA,UAAA;AAAA,EACA,uBAAA;AAAA,EACA,0BAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,uBAAA;AAAA,EACA,0BAAA;AAAA,EACA,6BAAA;AAAA,EACA;AACF,CAAC,CAAA;ACjBM,IAAM,mBAAA,GAAsBA,EAAE,IAAA,CAAK;AAAA,EACxC,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;ACPM,IAAM,kBAAA,GAAqBA,EAAE,IAAA,CAAK;AAAA,EACvC,MAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC,CAAA;;;ACFD,IAAM,wBAAA,GAA4D;AAAA,EAChE,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,WAAA;AAAA,EACV,aAAA,EAAe,gBAAA;AAAA,EACf,WAAA,EAAa,cAAA;AAAA,EACb,YAAA,EAAc,gBAAA;AAAA,EACd,WAAA,EAAa;AACf,CAAA;AAEA,IAAM,2BACJ,MAAA,CAAO,WAAA;AAAA,EACL,MAAA,CAAO,OAAA,CAAQ,wBAAwB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,GAAG,CAAA,KAAM,CAAC,GAAA,EAAK,GAAG,CAAC;AACzE,CAAA;AAEK,IAAM,iBAAA,GAAoB,CAAC,YAAA,KAAqC;AACrE,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAA,CAAU,YAAY,CAAA;AAExD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,gBAAgB,IAAA,CAAK,IAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,wBAAA,CAAyB,MAAA,CAAO,IAAI,CAAA,IAAK,gBAAgB,IAAA,CAAK,IAAA;AACvE,CAAA;AAEO,IAAM,iBAAA,GAAoB,CAAC,YAAA,KAAwC;AACxE,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,SAAA,CAAU,YAAY,CAAA;AAErD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,mBAAmB,IAAA,CAAK,IAAA;AAAA,EACjC;AAEA,EAAA,OAAO,wBAAA,CAAyB,MAAA,CAAO,IAAI,CAAA,IAAK,mBAAmB,IAAA,CAAK,IAAA;AAC1E,CAAA;AClCO,IAAM,0BAAA,GAA6B,CACxC,QAAA,EACA,OAAA,KACY;AACZ,EAAA,IAAI,QAAA,CAAS,IAAA,KAAS,kBAAA,CAAmB,IAAA,CAAK,oBAAA,EAAsB;AAClE,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,UAAA;AAClD,IAAA,OAAA,CAAQ,aAAa,QAAA,CAAS,GAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAAS,IAAA,KAAS,kBAAA,CAAmB,IAAA,CAAK,eAAA,EAAiB;AAC7D,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,aAAA;AAClD,IAAA,OAAA,CAAQ,gBAAgB,QAAA,CAAS,KAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAAS,IAAA,KAAS,kBAAA,CAAmB,IAAA,CAAK,kBAAA,EAAoB;AAChE,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,gBAAA;AAClD,IAAA,OAAA,CAAQ,gBAAgB,QAAA,CAAS,KAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;ACvBO,IAAM,qBAAA,GAAwB,CACnC,QAAA,EACA,OAAA,KACY;AACZ,EAAA,IAAI,QAAA,CAAS,IAAA,KAASC,kBAAAA,CAAmB,IAAA,CAAK,iBAAA,EAAmB;AAC/D,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,eAAA;AAClD,IAAA,OAAA,CAAQ,eAAe,QAAA,CAAS,OAAA;AAChC,IAAA,OAAA,CAAQ,eAAe,QAAA,CAAS,UAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAAS,IAAA,KAASA,kBAAAA,CAAmB,IAAA,CAAK,qBAAA,EAAuB;AACnE,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,mBAAA;AAClD,IAAA,OAAA,CAAQ,mBAAmB,QAAA,CAAS,MAAA;AACpC,IAAA,OAAA,CAAQ,eAAe,QAAA,CAAS,UAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAAS,IAAA,KAASA,kBAAAA,CAAmB,IAAA,CAAK,qBAAA,EAAuB;AACnE,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,mBAAA;AAClD,IAAA,OAAA,CAAQ,mBAAmB,QAAA,CAAS,QAAA;AACpC,IAAA,OAAA,CAAQ,eAAe,QAAA,CAAS,UAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AC1BO,IAAM,4BAAA,GAA+B,CAC1C,QAAA,EACA,OAAA,KACY;AACZ,EAAA,IACE,QAAA,CAAS,IAAA,KACTA,kBAAAA,CAAmB,IAAA,CAAK,oCAAA,EACxB;AACA,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,wBAAA;AAClD,IAAA,OAAA,CAAQ,aAAa,QAAA,CAAS,GAAA;AAC9B,IAAA,OAAA,CAAQ,eAAe,QAAA,CAAS,UAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IACE,QAAA,CAAS,IAAA,KAASA,kBAAAA,CAAmB,IAAA,CAAK,iCAAA,EAC1C;AACA,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,qBAAA;AAClD,IAAA,OAAA,CAAQ,aAAa,QAAA,CAAS,GAAA;AAC9B,IAAA,OAAA,CAAQ,eAAe,QAAA,CAAS,UAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAAS,IAAA,KAASA,kBAAAA,CAAmB,IAAA,CAAK,4BAAA,EAA8B;AAC1E,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,wBAAA;AAClD,IAAA,OAAA,CAAQ,gBAAgB,QAAA,CAAS,KAAA;AACjC,IAAA,OAAA,CAAQ,eAAe,QAAA,CAAS,UAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IACE,QAAA,CAAS,IAAA,KAASA,kBAAAA,CAAmB,IAAA,CAAK,+BAAA,EAC1C;AACA,IAAA,OAAA,CAAQ,YAAA,GACN,sBAAsB,IAAA,CAAK,2BAAA;AAC7B,IAAA,OAAA,CAAQ,gBAAgB,QAAA,CAAS,KAAA;AACjC,IAAA,OAAA,CAAQ,eAAe,QAAA,CAAS,UAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;ACzCO,IAAM,qBAAA,GAAwB,CACnC,QAAA,EACA,OAAA,KACY;AACZ,EAAA,IAAI,QAAA,CAAS,IAAA,KAASA,kBAAAA,CAAmB,IAAA,CAAK,IAAA,EAAM;AAClD,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,IAAA;AAClD,IAAA,OAAA,CAAQ,eAAe,QAAA,CAAS,OAAA;AAChC,IAAA,OAAA,CAAQ,aAAA,GAAgB,SAAS,OAAA,GAAU,GAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAAS,IAAA,KAASA,kBAAAA,CAAmB,IAAA,CAAK,QAAA,EAAU;AACtD,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,QAAA;AAClD,IAAA,OAAA,CAAQ,mBAAmB,QAAA,CAAS,MAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAAS,IAAA,KAASA,kBAAAA,CAAmB,IAAA,CAAK,QAAA,EAAU;AACtD,IAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,QAAA;AAClD,IAAA,OAAA,CAAQ,mBAAmB,QAAA,CAAS,QAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;;;ACrBO,IAAM,eAAA,GAAkB,CAC7B,IAAA,EACA,OAAA,KACS;AACT,EAAA,MAAM,EAAE,UAAS,GAAI,IAAA;AAErB,EAAA,IAAI,qBAAA,CAAsB,QAAA,EAAU,OAAO,CAAA,EAAG;AAC9C,EAAA,IAAI,0BAAA,CAA2B,QAAA,EAAU,OAAO,CAAA,EAAG;AACnD,EAAA,IAAI,qBAAA,CAAsB,QAAA,EAAU,OAAO,CAAA,EAAG;AAC9C,EAAA,IAAI,4BAAA,CAA6B,QAAA,EAAU,OAAO,CAAA,EAAG;AAErD,EAAA,OAAA,CAAQ,YAAA,GAAe,sBAAsB,IAAA,CAAK,IAAA;AACpD,CAAA;ACdO,IAAM,oBAAA,GAAuB,CAClC,IAAA,EACA,OAAA,KACS;AACT,EAAA,OAAA,CAAQ,UAAA,GAAa,oBAAoB,IAAA,CAAK,OAAA;AAC9C,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,gBAAA,CAAiB,KAAK,OAAA,EAAS;AAExD,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,KAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,gBAAA,CAAiB,IAAA,CAAK,KAAA,EAAO;AAC9C,IAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,IAAA,OAAA,CAAQ,yBAAyB,KAAA,CAAM,GAAA;AACvC,IAAA,OAAA,CAAQ,0BAA0B,KAAA,CAAM,GAAA;AAAA,EAC1C,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,IAAA,OAAA,CAAQ,yBAAyB,KAAA,CAAM,KAAA;AACvC,IAAA,OAAA,CAAQ,0BAA0B,KAAA,CAAM,KAAA;AAAA,EAC1C;AACF,CAAA;ACjBO,IAAM,sBAAA,GAAyB,CACpC,IAAA,EACA,OAAA,KACS;AACT,EAAA,OAAA,CAAQ,UAAA,GAAa,oBAAoB,IAAA,CAAK,SAAA;AAC9C,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAASC,gBAAAA,CAAiB,KAAK,UAAA,EAAY;AAE3D,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,KAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,IAAA,KAASC,gBAAAA,CAAiB,IAAA,CAAK,IAAA,EAAM;AAC7C,IAAA,OAAA,CAAQ,eAAe,KAAA,CAAM,KAAA;AAAA,EAC/B,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASA,gBAAAA,CAAiB,KAAK,KAAA,EAAO;AACrD,IAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,IAAA,OAAA,CAAQ,2BAA2B,KAAA,CAAM,GAAA;AACzC,IAAA,OAAA,CAAQ,4BAA4B,KAAA,CAAM,GAAA;AAAA,EAC5C,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASA,gBAAAA,CAAiB,KAAK,GAAA,EAAK;AAEnD,IAAA,OAAA,CAAQ,WAAA,GAAc,MAAM,KAAA,GAAQ,GAAA;AAAA,EACtC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASA,gBAAAA,CAAiB,KAAK,WAAA,EAAa;AAE3D,IAAA,OAAA,CAAQ,cAAc,KAAA,CAAM,KAAA;AAAA,EAC9B;AACF,CAAA;ACrBO,IAAM,iBAAA,GAAoB,CAC/B,IAAA,EACA,OAAA,KACS;AACT,EAAA,OAAA,CAAQ,UAAA,GAAa,oBAAoB,IAAA,CAAK,KAAA;AAC9C,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAASD,gBAAAA,CAAiB,KAAK,IAAA,EAAM;AAErD,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,KAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,IAAA,KAASC,gBAAAA,CAAiB,IAAA,CAAK,IAAA,EAAM;AAC7C,IAAA,OAAA,CAAQ,kBAAkB,KAAA,CAAM,KAAA;AAAA,EAClC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASA,gBAAAA,CAAiB,KAAK,KAAA,EAAO;AACrD,IAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,IAAA,OAAA,CAAQ,uBAAuB,KAAA,CAAM,GAAA;AACrC,IAAA,OAAA,CAAQ,wBAAwB,KAAA,CAAM,GAAA;AAAA,EACxC,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,IAAA,OAAA,CAAQ,uBAAuB,KAAA,CAAM,KAAA;AACrC,IAAA,OAAA,CAAQ,wBAAwB,KAAA,CAAM,KAAA;AAAA,EACxC;AACF,CAAA;ACnBO,IAAM,kBAAA,GAAqB,CAChC,IAAA,EACA,OAAA,KACS;AACT,EAAA,OAAA,CAAQ,UAAA,GAAa,oBAAoB,IAAA,CAAK,KAAA;AAC9C,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAASD,gBAAAA,CAAiB,KAAK,KAAA,EAAO;AAEtD,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,KAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,IAAA,KAASC,gBAAAA,CAAiB,IAAA,CAAK,IAAA,EAAM;AAC7C,IAAA,OAAA,CAAQ,kBAAkB,KAAA,CAAM,KAAA;AAAA,EAClC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASA,gBAAAA,CAAiB,KAAK,KAAA,EAAO;AACrD,IAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,IAAA,OAAA,CAAQ,uBAAuB,KAAA,CAAM,GAAA;AACrC,IAAA,OAAA,CAAQ,wBAAwB,KAAA,CAAM,GAAA;AAAA,EACxC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASA,gBAAAA,CAAiB,KAAK,KAAA,EAAO;AAErD,IAAA,OAAA,CAAQ,WAAA,GAAc,MAAM,KAAA,GAAQ,GAAA;AAAA,EACtC,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAASA,gBAAAA,CAAiB,KAAK,WAAA,EAAa;AAE3D,IAAA,OAAA,CAAQ,cAAc,KAAA,CAAM,KAAA;AAAA,EAC9B;AACF,CAAA;AChBO,IAAM,mBAAA,GAAsB,CACjC,IAAA,EACA,OAAA,KACS;AACT,EAAA,OAAA,CAAQ,UAAA,GAAa,oBAAoB,IAAA,CAAK,UAAA;AAC9C,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAASD,gBAAAA,CAAiB,KAAK,WAAA,EAAa;AAG5D,EAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,KAAA;AAEhC,EAAA,OAAA,CAAQ,cAAc,WAAA,CAAY,KAAA;AACpC,CAAA;;;ACZO,IAAM,aAAA,GAAgB,CAC3B,IAAA,EACA,OAAA,KACS;AACT,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAASA,gBAAAA,CAAiB,KAAK,IAAA,EAAM;AACnD,IAAA,OAAA,CAAQ,UAAA,GAAa,oBAAoB,IAAA,CAAK,IAAA;AAC9C,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAASA,gBAAAA,CAAiB,KAAK,KAAA,EAAO;AACpD,IAAA,kBAAA,CAAmB,MAAM,OAAO,CAAA;AAAA,EAClC,WAAW,IAAA,CAAK,MAAA,CAAO,IAAA,KAASA,gBAAAA,CAAiB,KAAK,UAAA,EAAY;AAChE,IAAA,sBAAA,CAAuB,MAAM,OAAO,CAAA;AAAA,EACtC,WAAW,IAAA,CAAK,MAAA,CAAO,IAAA,KAASA,gBAAAA,CAAiB,KAAK,OAAA,EAAS;AAC7D,IAAA,oBAAA,CAAqB,MAAM,OAAO,CAAA;AAAA,EACpC,WAAW,IAAA,CAAK,MAAA,CAAO,IAAA,KAASA,gBAAAA,CAAiB,KAAK,IAAA,EAAM;AAC1D,IAAA,iBAAA,CAAkB,MAAM,OAAO,CAAA;AAAA,EACjC,WAAW,IAAA,CAAK,MAAA,CAAO,IAAA,KAASA,gBAAAA,CAAiB,KAAK,WAAA,EAAa;AACjE,IAAA,mBAAA,CAAoB,MAAM,OAAO,CAAA;AAAA,EACnC;AACF,CAAA;;;ACrBA,IAAM,oBAAA,GAAuB,GAAA;AAYtB,IAAM,qBAAqB,CAChC,IAAA,EACA,cACA,MAAA,EACA,OAAA,GAAqC,EAAC,KACV;AAC5B,EAAA,MAAM,EAAE,eAAA,GAAkB,UAAA,EAAW,GAAI,OAAA;AAEzC,EAAA,MAAA,CAAO,MAAM,yBAAA,EAA2B,EAAE,SAAA,EAAW,IAAA,CAAK,WAAW,CAAA;AAErE,EAAA,MAAM,eAAA,GAA2C;AAAA,IAC/C;AAAA,GACF;AAEA,EAAA,IAAI,KAAK,IAAA,EAAM;AACb,IAAA,eAAA,CAAgB,cAAc,IAAA,CAAK,IAAA;AAAA,EACrC;AAEA,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,eAAA,CAAgB,YAAY,IAAA,CAAK,SAAA;AAAA,EACnC;AAEA,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,IAAA,eAAA,CAAgB,KAAA,GAAQ,YAAA;AAAA,MACtB,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,SAAA;AAAA,MACL,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,IAAA,eAAA,CAAgB,SAAA,GAAY,iBAAA,CAAkB,IAAA,CAAK,SAAS,CAAA;AAAA,EAC9D;AAEA,EAAA,eAAA,CAAgB,MAAM,eAAe,CAAA;AACrC,EAAA,aAAA,CAAc,MAAM,eAAe,CAAA;AAEnC,EAAA,OAAO,eAAA;AACT,CAAA;AAEA,IAAM,YAAA,GAAe,CACnB,KAAA,EACA,SAAA,EACA,UACA,MAAA,KACW;AACX,EAAA,IAAI,KAAA,CAAM,UAAU,oBAAA,EAAsB;AACxC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,MAAM,qBAAA;AAAA,MACJ,gBAAgB,oBAAoB,CAAA,oBAAA,EAAuB,SAAS,CAAA,UAAA,EACtD,MAAM,MAAM,CAAA,oDAAA;AAAA,KAC5B;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,CAAA,qBAAA,EAAwB,KAAA,CAAM,MAAM,CAAA,IAAA,EAAO,oBAAoB,CAAA,WAAA,CAAA;AAAA,IAC/D,EAAE,SAAA,EAAW,cAAA,EAAgB,KAAA,CAAM,MAAA;AAAO,GAC5C;AACA,EAAA,OAAO,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,oBAAoB,CAAA;AAChD,CAAA;;;ACtEO,IAAM,sBAAsB,CACjC,OAAA,EACA,MAAA,EACA,OAAA,GAAsC,EAAC,KACpB;AACnB,EAAA,MAAA,CAAO,MAAM,0BAAA,EAA4B,EAAE,WAAW,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA;AAE5E,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,KAAA,EAAO;AAChC,IAAA,IAAIE,iBAAAA,CAAkB,IAAI,CAAA,EAAG;AAC3B,MAAA,MAAM,kBAAA,GAAqB,sBAAA;AAAA,QACzB,IAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,kBAAkB,CAAA;AACnC,MAAA,YAAA,IAAgB,kBAAA,CAAmB,MAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,MAAM,WAAA,GAAc,kBAAA;AAAA,QAClB,IAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AACzB,MAAA,YAAA,IAAgB,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT,CAAA;AAEA,IAAM,sBAAA,GAAyB,CAC7B,KAAA,EACA,UAAA,EACA,QACA,OAAA,KACmB;AACnB,EAAA,MAAA,CAAO,MAAM,6BAAA,EAA+B;AAAA,IAC1C,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,SAAA,EAAW,MAAM,KAAA,CAAM;AAAA,GACxB,CAAA;AAED,EAAA,MAAM,WAA2B,EAAC;AAClC,EAAA,IAAI,YAAA,GAAe,UAAA;AAEnB,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,IAAA,EAAM,YAAA,EAAc,QAAQ,OAAO,CAAA;AAC1E,IAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AACzB,IAAA,YAAA,IAAgB,CAAA;AAAA,EAClB;AAEA,EAAA,MAAM,aAAA,GAAyC;AAAA,IAC7C,SAAS,mBAAA,CAAoB,YAAA;AAAA,IAC7B,YAAA;AAAA,IACA,YAAA,EAAc,sBAAsB,IAAA,CAAK,qBAAA;AAAA,IACzC,YAAA,EAAc,UAAA;AAAA,IACd,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,UAAA,EAAY,oBAAoB,IAAA,CAAK;AAAA,GACvC;AACA,EAAA,QAAA,CAAS,KAAK,aAAa,CAAA;AAE3B,EAAA,OAAO,QAAA;AACT,CAAA;;;AChEA,IAAM,QAAA,GAAW,CAAC,KAAA,KAA4C;AAC5D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAC;AACV,CAAA;AAMA,IAAM,cAAA,GAAiB,CAAC,GAAA,EAAU,MAAA,KAA4B;AAC5D,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,EAAY,kBAAA;AACnC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAMC,sBAAsB,wCAAwC,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,SAAA,CAAU,UAAU,CAAA;AACjD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,SAAS,MAAA,CAAO,KAAA,CAAM,OACzB,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAC9C,KAAK,IAAI,CAAA;AACZ,IAAA,MAAA,CAAO,KAAA,CAAM,wCAAA,EAA0C,EAAE,MAAA,EAAQ,CAAA;AACjE,IAAA,MAAMA,qBAAAA,CAAsB,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAE,CAAA;AAAA,EAC/D;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB,CAAA;AAEO,IAAM,oBAAA,GAAuB,CAClC,GAAA,EACA,MAAA,KACmB;AACnB,EAAA,MAAA,CAAO,MAAM,gCAAgC,CAAA;AAE7C,EAAA,MAAM,WAA2B,EAAC;AAElC,EAAA,MAAM,aAAA,GAAgB,uBAAA,CAAwB,GAAA,EAAK,MAAM,CAAA;AACzD,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA,IACZ,SAAS,mBAAA,CAAoB,OAAA;AAAA,IAC7B,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,EAAK,MAAM,CAAA;AAE1C,EAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,OAAA,EAAS,MAAM,CAAA;AAC7D,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA,IACZ,SAAS,mBAAA,CAAoB,OAAA;AAAA,IAC7B,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,MAAM,mBAAA,GAAsB,mBAAA,CAAoB,OAAA,EAAS,MAAM,CAAA;AAC/D,EAAA,KAAA,MAAW,eAAe,mBAAA,EAAqB;AAC7C,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,SAAS,mBAAA,CAAoB,YAAA;AAAA,MAC7B,GAAG,SAAS,WAAW;AAAA,KACxB,CAAA;AAAA,EACH;AAEA,EAAA,MAAA,CAAO,MAAM,+BAAA,EAAiC;AAAA,IAC5C,cAAc,QAAA,CAAS;AAAA,GACxB,CAAA;AAED,EAAA,OAAO,QAAA;AACT,CAAA;;;ACzEA,IAAM,sBAAA,GAAyB,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,EAAE,CAAA;AAQ5C,IAAM,oBAAA,GAAuB,CAAC,WAAA,KACnC,WAAA,GAAc,sBAAA;AAkBT,IAAM,mBAAA,GAAsB,CACjC,cAAA,EACA,cAAA,KACY;AACZ,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,cAAc,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,cAAc,CAAA,EAAG;AACxE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,qBAAqB,cAAc,CAAA;AACtD,EAAA,MAAM,UAAA,GAAa,qBAAqB,cAAc,CAAA;AAEtD,EAAA,OACE,cAAc,GAAA,IACd,UAAA,IAAc,EAAA,IACd,UAAA,IAAc,QACd,UAAA,IAAc,GAAA;AAElB,CAAA;ACjDO,IAAM,mBAAA,GAAsBL,EAAE,IAAA,CAAK;AAAA,EACxC,aAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;;;ACNM,IAAM,qBAAA,GAAiE;AAAA,EAC5E,KAAA,EAAO,aAAA;AAAA,EACP,OAAA,EAAS,aAAA;AAAA,EACT,WAAA,EAAa,2BAAA;AAAA,EACb,SAAA,EAAW,YAAA;AAAA,EACX,OAAA,EAAS,aAAA;AAAA,EACT,SAAA,EAAW,cAAA;AAAA,EACX,OAAA,EAAS,qBAAA;AAAA,EACT,GAAA,EAAK,WAAA;AAAA,EACL,WAAA,EAAa,cAAA;AAAA,EACb,OAAA,EAAS,cAAA;AAAA,EACT,kBAAA,EAAoB,cAAA;AAAA,EACpB,WAAA,EAAa,cAAA;AAAA,EACb,UAAA,EAAY,cAAA;AAAA,EACZ,cAAA,EAAgB,cAAA;AAAA,EAChB,aAAA,EAAe,cAAA;AAAA,EACf,YAAA,EAAc,cAAA;AAAA,EACd,WAAA,EAAa,cAAA;AAAA,EACb,cAAA,EAAgB,cAAA;AAAA,EAChB,aAAA,EAAe,cAAA;AAAA,EACf,UAAA,EAAY,cAAA;AAAA,EACZ,UAAA,EAAY,cAAA;AAAA,EACZ,iBAAA,EAAmB,cAAA;AAAA,EACnB,qBAAA,EAAuB,cAAA;AAAA,EACvB,oBAAA,EAAsB,cAAA;AAAA,EACtB,QAAA,EAAU,sBAAA;AAAA,EACV,gBAAA,EAAkB,cAAA;AAAA,EAClB,MAAA,EAAQ,WAAA;AAAA,EACR,UAAA,EAAY,cAAA;AAAA,EACZ,UAAA,EAAY,cAAA;AAAA,EACZ,WAAA,EAAa,cAAA;AAAA,EACb,eAAA,EAAiB,cAAA;AAAA,EACjB,cAAA,EAAgB,cAAA;AAAA,EAChB,mBAAA,EAAqB,cAAA;AAAA,EACrB,aAAA,EAAe,cAAA;AAAA,EACf,YAAA,EAAc;AAChB,CAAA;;;AC3BA,IAAM,iBAAA,GAAoB,CACxB,QAAA,EACA,YAAA,KAC0B;AAC1B,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,QAAQ,YAAA;AAAc,MACpB,KAAK,OAAA;AACH,QAAA,OAAO,aAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,YAAA;AAAA,MACT,KAAK,aAAA;AAAA,MACL,KAAK,gBAAA;AACH,QAAA,OAAO,aAAA;AAAA,MACT;AACE,QAAA,OAAO,aAAA;AAAA;AACX,EACF;AACA,EAAA,OAAO,qBAAA,CAAsB,QAAQ,CAAA,IAAK,cAAA;AAC5C,CAAA;AAGO,IAAM,gBAAA,GAAmB,CAAC,GAAA,MAAoC;AAAA,EACnE,WAAW,IAAI,IAAA,CAAK,IAAI,SAAA,GAAY,GAAI,EAAE,WAAA,EAAY;AAAA,EACtD,SAAA,EAAW,iBAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,IAAI,SAAS,CAAA;AAAA,EACrD,YAAY,GAAA,CAAI,UAAA;AAAA,EAChB,MAAM,GAAA,CAAI;AACZ,CAAA,CAAA;AClCO,IAAM,cAAA,GAAiBA,EAAE,IAAA,CAAK;AAAA,EACnC,OAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,oBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,uBAAA;AAAA,EACA,sBAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC,CAAA;AAOM,IAAM,kBAAA,GAAqBA,EAAE,IAAA,CAAK;AAAA,EACvC,OAAA;AAAA,EACA,MAAA;AAAA,EACA,wBAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AASM,IAAM,qBAAA,GAAwBA,EAAE,MAAA,CAAO;AAAA,EAC5C,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,KAAA,EAAO,cAAA;AAAA,EACP,SAAA,EAAW,kBAAA;AAAA,EACX,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC,CAAA;;;AC5DM,IAAM,oBAAA,GAAuB,CAClC,IAAA,KACa;AACb,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,KAAA,CAAM,IAAI,CAAA;AACjD,EAAA,OAAO,iBAAiB,QAAQ,CAAA;AAClC,CAAA;AAQO,IAAM,qBAAA,GAAwB,CACnC,MAAA,KACe;AACf,EAAA,OAAO,MAAA,CAAO,IAAI,oBAAoB,CAAA;AACxC,CAAA;;;AChCA,IAAM,sBAAA,GAAyB,CAC7B,OAAA,KACmC;AACnC,EAAA,MAAM,YAA4C,EAAC;AAEnD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,IAAI,IAAI,UAAA,CAAW,YAAY,KAAK,GAAA,CAAI,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAClE,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,SAAA,EAAW,GAAA;AAAA,QACX;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT,CAAA;AAEO,IAAM,6BAAA,GAAgC,CAC3C,QAAA,KACmC;AACnC,EAAA,MAAM,kBAAkD,EAAC;AACzD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC1C,MAAA,MAAM,SAAA,GAAY,sBAAA;AAAA,QAChB;AAAA,OACF;AACA,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,QAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,eAAA;AACT,CAAA;;;AC1BO,IAAM,oBAAA,GAAuB,CAClC,QAAA,EACA,MAAA,KAC4B;AAC5B,EAAA,MAAA,CAAO,MAAM,2BAA2B,CAAA;AAExC,EAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,QAAA,EAAU,MAAM,CAAA;AAC/D,EAAA,MAAM,eAAA,GAAkB,0BAA0B,QAAQ,CAAA;AAE1D,EAAA,OAAO,eAAA,CAAgB,eAAA,EAAiB,eAAA,EAAiB,MAAM,CAAA;AACjE,CAAA;AAEA,IAAM,sBAAA,GAAyB,CAC7B,QAAA,EACA,MAAA,KACmD;AACnD,EAAA,MAAM,gBAAA,uBAAuB,GAAA,CAAY;AAAA,IACvC,oBAAoB,IAAA,CAAK,WAAA;AAAA,IACzB,oBAAoB,IAAA,CAAK,YAAA;AAAA,IACzB,oBAAoB,IAAA,CAAK;AAAA,GAC1B,CAAA;AAED,EAAA,MAAM,kBAAkE,EAAC;AAEzE,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACnD,IAAA,IAAI,CAAC,iBAAiB,GAAA,CAAI,GAAG,KAAK,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,MAAA,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,WAAA,EAAa,KAAK,CAAA;AAC/D,MAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,KAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,OAAO,eAAA;AACT,CAAA;AAEA,IAAM,yBAAA,GAA4B,CAChC,QAAA,KACmC;AACnC,EAAA,MAAM,kBAAkD,EAAC;AAEzD,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC3C,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACjC,MAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,6BAAA,CAA8B,KAAK,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,OAAO,eAAA;AACT,CAAA;AAEA,IAAM,eAAA,GAAkB,CACtB,eAAA,EACA,eAAA,EACA,MAAA,KAC4B;AAC5B,EAAA,MAAM,aAAsC,EAAC;AAE7C,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,MAAA,CAAO,KAAK,4BAAA,EAA8B;AAAA,MACxC,OAAO,eAAA,CAAgB;AAAA,KACxB,CAAA;AACD,IAAA,UAAA,CAAW,eAAA,GAAkB,eAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,CAAE,SAAS,CAAA,EAAG;AAC3C,IAAA,MAAA,CAAO,KAAK,iCAAA,EAAmC;AAAA,MAC7C,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,eAAe;AAAA,KACnC,CAAA;AACD,IAAA,UAAA,CAAW,eAAA,GAAkB,eAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,UAAA;AACT,CAAA;ACvEO,IAAM,mBAAA,GAAsBA,EAAE,IAAA,CAAK;AAAA,EACxC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;ACbM,IAAM,cAAA,GAAiBA,EAAE,IAAA,CAAK;AAAA,EACnC,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC,CAAA;;;ACIM,IAAM,YAAA,GAAeA,EAAE,MAAA,CAAO;AAAA;AAAA,EAEnC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA;AAAA,EAGpB,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,gBAAA,EAAkBA,EAAE,MAAA,EAAO;AAAA,EAC3B,cAAA,EAAgBA,EAAE,MAAA,EAAO;AAAA;AAAA,EAGzB,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAGnC,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,gBAAA,EAAkBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACtC,gBAAA,EAAkBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAGtC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAGlC,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAGhC,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,eAAA,EAAiBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAGrC,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAGlC,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAGnC,UAAA,EAAY,oBAAoB,QAAA,EAAS;AAAA,EACzC,KAAA,EAAO,eAAe,QAAA,EAAS;AAAA,EAC/B,QAAA,EAAU,kBAAkB,QAAA,EAAS;AAAA;AAAA,EAGrC,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAGhC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC3B,CAAC,CAAA;;;ACrDM,IAAM,qBAAA,GAAwB,CAAC,GAAA,KAAsC;AAC1E,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,eAAA;AAAA,IACL,KAAK,aAAA;AAAA,IACL,KAAK,kBAAA;AAAA,IACL,KAAK,gBAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,kBAAA;AACH,MAAA,OAAO,mBAAA;AAAA;AAEb,CAAA;;;ACfO,IAAM,cAAA,GAAiB,CAAC,GAAA,MAAyB;AAAA;AAAA,EAEtD,WAAW,IAAI,IAAA,CAAK,IAAI,SAAA,GAAY,GAAI,EAAE,WAAA,EAAY;AAAA,EACtD,gBAAA,EAAkB,IAAI,gBAAA,GAAmB,GAAA;AAAA,EACzC,cAAA,EAAgB,IAAI,cAAA,GAAiB,GAAA;AAAA;AAAA,EAGrC,eAAe,GAAA,CAAI,aAAA;AAAA;AAAA,EAGnB,cAAc,GAAA,CAAI,YAAA;AAAA,EAClB,cAAc,GAAA,CAAI,YAAA;AAAA;AAAA,EAGlB,YAAY,GAAA,CAAI,UAAA;AAAA,EAChB,YAAY,GAAA,CAAI,UAAA;AAAA;AAAA,EAGhB,UAAU,GAAA,CAAI,QAAA;AAAA,EACd,UAAU,GAAA,CAAI,QAAA;AAAA,EACd,iBAAiB,GAAA,CAAI,eAAA;AAAA;AAAA,EAGrB,QAAA,EAAU,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI,QAAA;AAAA,EACtC,QAAA,EAAU,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI,QAAA;AAAA;AAAA,EAGtC,aAAa,GAAA,CAAI,WAAA;AAAA,EACjB,cAAc,GAAA,CAAI,YAAA;AAAA;AAAA,EAGlB,eAAe,GAAA,CAAI,aAAA;AAAA;AAAA,EAGnB,SAAS,GAAA,CAAI,UAAA,GAAa,qBAAA,CAAsB,GAAA,CAAI,UAAU,CAAA,GAAI,MAAA;AAAA,EAClE,OAAO,GAAA,CAAI,KAAA;AAAA,EACX,UAAU,GAAA,CAAI,QAAA,GAAW,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AAAA;AAAA,EAG1D,kBAAkB,GAAA,CAAI,YAAA;AAAA;AAAA,EAGtB,YAAY,GAAA,CAAI,UAAA;AAAA,EAChB,YACE,GAAA,CAAI,UAAA,KAAe,SACf,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA,GACjC;AACR,CAAA,CAAA;;;AC7CO,IAAM,kBAAA,GAAqB,CAAC,IAAA,KAA0C;AAC3E,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AACtC,EAAA,OAAO,eAAe,MAAM,CAAA;AAC9B,CAAA;AAQO,IAAM,mBAAA,GAAsB,CACjC,IAAA,KACa;AACb,EAAA,OAAO,IAAA,CAAK,IAAI,kBAAkB,CAAA;AACpC,CAAA;ACpBO,IAAM,eAAA,GAAkBA,EAAE,MAAA,CAAO;AAAA,EACtC,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,gBAAA,EAAkBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACtC,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,iBAAA,EAAmBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACvC,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,mBAAA,EAAqBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzC,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,iBAAA,EAAmBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACvC,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,mBAAA,EAAqBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAClC,CAAC,CAAA;;;ACtBD,IAAM,cAAA,GAAiB,CACrB,GAAA,KAC6C;AAC7C,EAAA,IAAI,GAAA,CAAI,WAAA,KAAgB,MAAA,IAAa,GAAA,CAAI,iBAAiB,MAAA,EAAW;AACnE,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,oBAAA,CAAqB,GAAA,CAAI,WAAW,CAAA;AAAA,MACzC,GAAA,EAAK,oBAAA,CAAqB,GAAA,CAAI,YAAY;AAAA,KAC5C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT,CAAA;AAEA,IAAM,sBAAA,GAAyB,CAAC,GAAA,EAAgB,MAAA,KAA4B;AAC1E,EAAA,IAAI,GAAA,CAAI,qBAAqB,MAAA,EAAW;AACtC,IAAA,MAAA,CAAO,WAAW,GAAA,CAAI,gBAAA;AAAA,EACxB,CAAA,MAAA,IAAW,GAAA,CAAI,QAAA,KAAa,MAAA,EAAW;AACrC,IAAA,MAAA,CAAO,WAAW,GAAA,CAAI,QAAA;AAAA,EACxB;AACA,EAAA,IAAI,GAAA,CAAI,kBAAkB,MAAA,EAAW;AACnC,IAAA,MAAA,CAAO,QAAQ,GAAA,CAAI,aAAA;AAAA,EACrB,CAAA,MAAA,IAAW,GAAA,CAAI,KAAA,KAAU,MAAA,EAAW;AAClC,IAAA,MAAA,CAAO,QAAQ,GAAA,CAAI,KAAA;AAAA,EACrB;AACF,CAAA;AAEA,IAAM,gBAAA,GAAmB,CAAC,GAAA,EAAgB,MAAA,KAA4B;AACpE,EAAA,IAAI,GAAA,CAAI,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,GAAA,CAAI,QAAA;AACtD,EAAA,IAAI,GAAA,CAAI,SAAA,KAAc,MAAA,EAAW,MAAA,CAAO,YAAY,GAAA,CAAI,SAAA;AACxD,EAAA,IAAI,GAAA,CAAI,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,GAAA,CAAI,KAAA;AAChD,EAAA,IAAI,GAAA,CAAI,WAAA,KAAgB,MAAA,EAAW,MAAA,CAAO,cAAc,GAAA,CAAI,WAAA;AAC5D,EAAA,IAAI,GAAA,CAAI,YAAY,MAAA,EAAW;AAC7B,IAAA,MAAA,CAAO,OAAA,GAAU,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,iBAAA,IAAqB,CAAA,CAAA;AAAA,EAC3D;AACF,CAAA;AAEA,IAAM,qBAAA,GAAwB,CAAC,GAAA,EAAgB,MAAA,KAA4B;AACzE,EAAA,IAAI,GAAA,CAAI,wBAAwB,MAAA,EAAW;AACzC,IAAA,MAAA,CAAO,sBAAsB,GAAA,CAAI,mBAAA;AAAA,EACnC;AACA,EAAA,IAAI,GAAA,CAAI,UAAA,KAAe,MAAA,EAAW,MAAA,CAAO,aAAa,GAAA,CAAI,UAAA;AAC1D,EAAA,IAAI,GAAA,CAAI,UAAA,KAAe,MAAA,EAAW,MAAA,CAAO,aAAa,GAAA,CAAI,UAAA;AAC5D,CAAA;AAMO,IAAM,iBAAA,GAAoB,CAAC,GAAA,KAA8B;AAC9D,EAAA,MAAM,MAAA,GAAoB;AAAA,IACxB,WAAW,IAAI,IAAA,CAAK,IAAI,SAAA,GAAY,GAAI,EAAE,WAAA;AAAY,GACxD;AAEA,EAAA,MAAM,QAAA,GAAW,eAAe,GAAG,CAAA;AACnC,EAAA,IAAI,QAAA,SAAiB,QAAA,GAAW,QAAA;AAChC,EAAA,sBAAA,CAAuB,KAAK,MAAM,CAAA;AAClC,EAAA,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAC5B,EAAA,qBAAA,CAAsB,KAAK,MAAM,CAAA;AAEjC,EAAA,OAAO,MAAA;AACT,CAAA;;;ACnDO,IAAM,qBAAA,GAAwB,CACnC,IAAA,KACc;AACd,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA;AAG5C,EAAA,MAAM,MAAA,GAAS,UAAU,WAAA,KAAgB,MAAA;AACzC,EAAA,MAAM,MAAA,GAAS,UAAU,YAAA,KAAiB,MAAA;AAE1C,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,IAAI,CAAC,mBAAA,CAAoB,SAAA,CAAU,WAAA,EAAc,SAAA,CAAU,YAAa,CAAA,EAAG;AACzE,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,OAAO,kBAAkB,SAAS,CAAA;AACpC,CAAA;AASO,IAAM,sBAAA,GAAyB,CACpC,OAAA,KACgB;AAChB,EAAA,OAAO,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AAC1C,CAAA;ACpCO,IAAM,gBAAA,GAAmBA,EAAE,MAAA,CAAO;AAAA,EACvC,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,EAAE,MAAA,EAAO;AAAA,EACpB,gBAAA,EAAkBA,EAAE,MAAA,EAAO;AAAA,EAC3B,cAAA,EAAgBA,EAAE,MAAA,EAAO;AAAA,EACzB,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,gBAAA,EAAkBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACtC,gBAAA,EAAkBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACtC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,eAAA,EAAiBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACrC,mBAAA,EAAqBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzC,eAAA,EAAiBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACrC,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,KAAA,EAAO,cAAA;AAAA,EACP,QAAA,EAAU,kBAAkB,QAAA,EAAS;AAAA,EACrC,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC5B,CAAC,CAAA;;;AC3BM,IAAM,kBAAA,GAAqB,CAAC,GAAA,MAAiC;AAAA,EAClE,WAAW,IAAI,IAAA,CAAK,IAAI,SAAA,GAAY,GAAI,EAAE,WAAA,EAAY;AAAA,EACtD,gBAAA,EAAkB,IAAI,gBAAA,GAAmB,GAAA;AAAA,EACzC,gBACE,GAAA,CAAI,cAAA,KAAmB,MAAA,GAAY,GAAA,CAAI,iBAAiB,GAAA,GAAO,MAAA;AAAA,EACjE,eAAe,GAAA,CAAI,aAAA;AAAA,EACnB,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,EACvB,UAAU,GAAA,CAAI,QAAA,GAAW,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AAAA,EAC1D,cAAc,GAAA,CAAI,YAAA;AAAA,EAClB,cAAc,GAAA,CAAI,YAAA;AAAA,EAClB,YAAY,GAAA,CAAI,UAAA;AAAA,EAChB,YAAY,GAAA,CAAI,UAAA;AAAA,EAChB,UAAU,GAAA,CAAI,QAAA;AAAA,EACd,UAAU,GAAA,CAAI,QAAA;AAAA,EACd,iBAAiB,GAAA,CAAI,eAAA;AAAA,EACrB,qBAAqB,GAAA,CAAI,mBAAA;AAAA,EACzB,iBAAiB,GAAA,CAAI,eAAA;AAAA,EACrB,eAAe,GAAA,CAAI,aAAA;AAAA,EACnB,aAAa,GAAA,CAAI,WAAA;AAAA,EACjB,cAAc,GAAA,CAAI,YAAA;AAAA,EAClB,QAAA,EAAU,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI,QAAA;AAAA,EACtC,QAAA,EAAU,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI;AACxC,CAAA,CAAA;;;ACnBO,IAAM,sBAAA,GAAyB,CACpC,IAAA,KACe;AACf,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAA,CAAM,IAAI,CAAA;AAC9C,EAAA,OAAO,mBAAmB,UAAU,CAAA;AACtC,CAAA;;;ACLA,IAAM,WAAA,GAAc,KAAA;AAKpB,IAAM,kBAAA,GAAqB,CAAC,WAAA,KAAiC;AAC3D,EAAA,IAAI,WAAA,YAAuB,IAAA,EAAM,OAAO,WAAA,CAAY,WAAA,EAAY;AAChE,EAAA,IAAI,OAAO,WAAA,KAAgB,QAAA;AACzB,IAAA,OAAO,IAAI,IAAA,CAAK,WAAA,GAAc,GAAI,EAAE,WAAA,EAAY;AAClD,EAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAChC,CAAA;AAEA,IAAM,gBAAA,GAAmB,CACvB,MAAA,EACA,OAAA,MACI;AAAA,EACJ,OAAA,EAAS,kBAAA,CAAmB,MAAA,GAAS,MAAA,CAAO,cAAc,MAAS,CAAA;AAAA,EACnE,KAAA,EAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,KAAA,GAAQ,MAAA,KAAc,OAAA;AAAA,EAChD,QAAA,EAAU,OAAA,GAAU,OAAA,CAAQ,QAAA,GAAW;AACzC,CAAA,CAAA;AAEA,IAAM,kBAAkB,CAAI,KAAA,KAC1B,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,GAAQ,MAAA;AAE7B,IAAM,mBAAmB,CAAI,IAAA,KAC3B,SAAS,MAAA,GAAY,CAAC,IAAI,CAAA,GAAI,MAAA;AAKzB,IAAM,oBAAA,GAAuB,CAClC,QAAA,EACA,MAAA,KACQ;AACR,EAAA,MAAM,SAAS,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,WAAW,IAAI,CAAC,CAAA;AACjE,EAAA,MAAM,cAAc,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,YAAY,KAAK,EAAC;AACxE,EAAA,MAAM,aAAa,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,WAAW,KAAK,EAAC;AACtE,EAAA,MAAM,YAAY,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,UAAU,KAAK,EAAC;AACpE,EAAA,MAAM,UAAU,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,QAAQ,KAAK,EAAC;AAEhE,EAAA,MAAA,CAAO,MAAM,uBAAA,EAAyB;AAAA,IACpC,UAAU,WAAA,CAAY,MAAA;AAAA,IACtB,SAAS,UAAA,CAAW,MAAA;AAAA,IACpB,QAAQ,SAAA,CAAU,MAAA;AAAA,IAClB,MAAM,OAAA,CAAQ;AAAA,GACf,CAAA;AAED,EAAA,MAAM,OAAA,GACJ,YAAY,MAAA,GAAS,CAAA,GAAI,uBAAuB,WAAA,CAAY,CAAC,CAAC,CAAA,GAAI,MAAA;AACpE,EAAA,MAAM,OAAA,GAAU,uBAAuB,UAAU,CAAA;AACjD,EAAA,MAAM,MAAA,GAAS,sBAAsB,SAAS,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,oBAAoB,OAAO,CAAA;AACxC,EAAA,MAAM,aAAA,GAAgB,oBAAA,CAAqB,QAAA,EAAU,MAAM,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,WAAA;AAAA,IACT,IAAA,EAAM,eAAe,IAAA,CAAK,iBAAA;AAAA,IAC1B,QAAA,EAAU,gBAAA;AAAA,MACR,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,iBAAiB,OAAO,CAAA;AAAA,IAClC,IAAA,EAAM,gBAAgB,IAAI,CAAA;AAAA,IAC1B,OAAA,EAAS,gBAAgB,OAAO,CAAA;AAAA,IAChC,MAAA,EAAQ,gBAAgB,MAAM,CAAA;AAAA,IAC9B,UAAA,EAAY,EAAE,GAAA,EAAK,aAAA;AAAc,GACnC;AACF,CAAA;ACxEO,IAAM,aAAA,GAAgB,YAAY,IAAA,CAAK,OAAA;AAMvC,IAAM,YAAA,GAAe,CAAC,QAAA,KAAwC;AACnE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,EAAY;AACnC,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,SAAA,CAAU,KAAK,CAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,IAAA,GAAO,aAAA;AACxC,CAAA;;;ACfO,IAAM,WAAA,GAAc,CACzB,MAAA,EACA,UAAA,EACA,MAAA,KACgB;AAChB,EAAA,MAAA,CAAO,MAAM,oCAAoC,CAAA;AAEjD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,UAAA,EAAY,KAAK,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,oBAAoB,MAAM,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,cAAc,MAAA,EAAQ,YAAA;AAAA,IACtB,OAAA,EAAS,MAAA,EAAQ,aAAA,IAAiB,MAAA,EAAQ,SAAS,QAAA,EAAS;AAAA,IAC5D,YAAA,EAAc,MAAA,EAAQ,YAAA,EAAc,QAAA,EAAS;AAAA,IAC7C;AAAA,GACF;AACF,CAAA;AAEA,IAAM,mBAAA,GAAsB,CAAC,MAAA,KAA0C;AACrE,EAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,IAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,EAChC;AAEA,EAAA,IAAI,OAAO,MAAA,CAAO,WAAA,KAAgB,QAAA,EAAU;AAC1C,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,EAChB;AAEA,EAAA,IAAI,MAAA,CAAO,uBAAuB,IAAA,EAAM;AACtC,IAAA,OAAO,MAAA,CAAO,YAAY,WAAA,EAAY;AAAA,EACxC;AAEA,EAAA,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAChC,CAAA;ACpCA,IAAM,mBAAA,GAAkD;AAAA,EACtD,CAAA,EAAG,QAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEO,IAAM,kBAAA,GAAqB,CAAC,OAAA,KAA4C;AAC7E,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,OAAO,iBAAiB,IAAA,CAAK,MAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,mBAAA,CAAoB,OAAO,CAAA,IAAK,gBAAA,CAAiB,IAAA,CAAK,MAAA;AAC/D,CAAA;ACTO,IAAM,mBAAA,GAAsB,CAAC,IAAA,KAA2C;AAC7E,EAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACnC,IAAA,OAAO;AAAA,MACL,IAAA,EAAMC,mBAAmB,IAAA,CAAK,IAAA;AAAA,MAC9B,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,uBAAA,GAA0B,CACrC,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,qBAAqB,MAAA,EAAW;AACvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,QAAA;AAAA,MAC9B,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,wBAAA,GAA2B,CACtC,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAW;AACjC,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,oBAAA;AAAA,MAC9B,KAAK,IAAA,CAAK;AAAA,KACZ;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,2BAAA,GAA8B,CACzC,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,IAAa,IAAA,CAAK,iBAAiB,MAAA,EAAW;AAClE,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,oCAAA;AAAA,MAC9B,KAAK,IAAA,CAAK,QAAA;AAAA,MACV,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,uBAAA,GAA0B,CACrC,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,qBAAqB,MAAA,EAAW;AACvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,QAAA;AAAA,MAC9B,UAAU,IAAA,CAAK;AAAA,KACjB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,oBAAA,GAAuB,CAClC,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AACpC,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,eAAA;AAAA,MAC9B,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,uBAAA,GAA0B,CACrC,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AACpC,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,kBAAA;AAAA,MAC9B,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;ACjFO,IAAM,sBAAA,GAAyB,CACpC,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,YAAA,KAAiB,MAAA,IAAa,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACtE,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,iBAAA;AAAA,MAC9B,SAAS,IAAA,CAAK,YAAA;AAAA,MACd,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,0BAAA,GAA6B,CACxC,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,MAAA,IAAa,IAAA,CAAK,iBAAiB,MAAA,EAAW;AAC1E,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,qBAAA;AAAA,MAC9B,QAAQ,IAAA,CAAK,gBAAA;AAAA,MACb,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,0BAAA,GAA6B,CACxC,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,gBAAA,KAAqB,MAAA,IAAa,IAAA,CAAK,iBAAiB,MAAA,EAAW;AAC1E,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,qBAAA;AAAA,MAC9B,UAAU,IAAA,CAAK,gBAAA;AAAA,MACf,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,4BAAA,GAA+B,CAC1C,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,IAAa,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACpE,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,iCAAA;AAAA,MAC9B,KAAK,IAAA,CAAK,UAAA;AAAA,MACV,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,+BAAA,GAAkC,CAC7C,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,MAAA,IAAa,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACvE,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,4BAAA;AAAA,MAC9B,OAAO,IAAA,CAAK,aAAA;AAAA,MACZ,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,IAAM,kCAAA,GAAqC,CAChD,IAAA,KACoB;AACpB,EAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,MAAA,IAAa,IAAA,CAAK,iBAAiB,MAAA,EAAW;AACvE,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,mBAAmB,IAAA,CAAK,+BAAA;AAAA,MAC9B,OAAO,IAAA,CAAK,aAAA;AAAA,MACZ,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;;;AChDA,IAAM,mBAAA,GAGF;AAAA,EACF,CAAC,qBAAA,CAAsB,IAAA,CAAK,IAAI,GAAG,mBAAA;AAAA,EACnC,CAAC,qBAAA,CAAsB,IAAA,CAAK,QAAQ,GAAG,uBAAA;AAAA,EACvC,CAAC,qBAAA,CAAsB,IAAA,CAAK,UAAU,GAAG,wBAAA;AAAA,EACzC,CAAC,qBAAA,CAAsB,IAAA,CAAK,wBAAwB,GAClD,2BAAA;AAAA,EACF,CAAC,qBAAA,CAAsB,IAAA,CAAK,QAAQ,GAAG,uBAAA;AAAA,EACvC,CAAC,qBAAA,CAAsB,IAAA,CAAK,aAAa,GAAG,oBAAA;AAAA,EAC5C,CAAC,qBAAA,CAAsB,IAAA,CAAK,gBAAgB,GAAG,uBAAA;AAAA,EAC/C,CAAC,qBAAA,CAAsB,IAAA,CAAK,eAAe,GAAG,sBAAA;AAAA,EAC9C,CAAC,qBAAA,CAAsB,IAAA,CAAK,mBAAmB,GAAG,0BAAA;AAAA,EAClD,CAAC,qBAAA,CAAsB,IAAA,CAAK,mBAAmB,GAAG,0BAAA;AAAA,EAClD,CAAC,qBAAA,CAAsB,IAAA,CAAK,qBAAqB,GAC/C,4BAAA;AAAA,EACF,CAAC,qBAAA,CAAsB,IAAA,CAAK,wBAAwB,GAClD,+BAAA;AAAA,EACF,CAAC,qBAAA,CAAsB,IAAA,CAAK,2BAA2B,GACrD;AACJ,CAAA;AAEO,IAAM,kBAAA,GAAqB,CAAC,IAAA,KAAoC;AACrE,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,SAAA,CAAU,IAAA,CAAK,YAAY,CAAA;AAEhE,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,EAAE,IAAA,EAAMA,kBAAAA,CAAmB,IAAA,CAAK,IAAA,EAAK;AAAA,EAC9C;AAEA,EAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,MAAA,CAAO,IAAI,CAAA;AACjD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,UAAU,IAAI,CAAA,IAAK,EAAE,IAAA,EAAMA,kBAAAA,CAAmB,KAAK,IAAA,EAAK;AAAA,EACjE;AAEA,EAAA,OAAO,EAAE,IAAA,EAAMA,kBAAAA,CAAmB,IAAA,CAAK,IAAA,EAAK;AAC9C,CAAA;;;AC1DO,IAAM,WAAA,GAAc,CAAC,IAAA,KAAmC;AAC7D,EAAA,OAAO,mBAAmB,IAAI,CAAA;AAChC,CAAA;AAEA,IAAM,wBAAA,GAAyD;AAAA,EAC7D,CAAC,qBAAA,CAAsB,IAAA,CAAK,IAAI,GAAGA,mBAAmB,IAAA,CAAK,IAAA;AAAA,EAC3D,CAAC,qBAAA,CAAsB,IAAA,CAAK,QAAQ,GAAGA,mBAAmB,IAAA,CAAK,QAAA;AAAA,EAC/D,CAAC,qBAAA,CAAsB,IAAA,CAAK,UAAU,GACpCA,mBAAmB,IAAA,CAAK,oBAAA;AAAA,EAC1B,CAAC,qBAAA,CAAsB,IAAA,CAAK,wBAAwB,GAClDA,mBAAmB,IAAA,CAAK,oCAAA;AAAA,EAC1B,CAAC,qBAAA,CAAsB,IAAA,CAAK,QAAQ,GAAGA,mBAAmB,IAAA,CAAK,QAAA;AAAA,EAC/D,CAAC,qBAAA,CAAsB,IAAA,CAAK,aAAa,GACvCA,mBAAmB,IAAA,CAAK,eAAA;AAAA,EAC1B,CAAC,qBAAA,CAAsB,IAAA,CAAK,gBAAgB,GAC1CA,mBAAmB,IAAA,CAAK,kBAAA;AAAA,EAC1B,CAAC,qBAAA,CAAsB,IAAA,CAAK,eAAe,GACzCA,mBAAmB,IAAA,CAAK,iBAAA;AAAA,EAC1B,CAAC,qBAAA,CAAsB,IAAA,CAAK,mBAAmB,GAC7CA,mBAAmB,IAAA,CAAK,qBAAA;AAAA,EAC1B,CAAC,qBAAA,CAAsB,IAAA,CAAK,mBAAmB,GAC7CA,mBAAmB,IAAA,CAAK,qBAAA;AAAA,EAC1B,CAAC,qBAAA,CAAsB,IAAA,CAAK,qBAAqB,GAC/CA,mBAAmB,IAAA,CAAK,iCAAA;AAAA,EAC1B,CAAC,qBAAA,CAAsB,IAAA,CAAK,wBAAwB,GAClDA,mBAAmB,IAAA,CAAK,4BAAA;AAAA,EAC1B,CAAC,qBAAA,CAAsB,IAAA,CAAK,2BAA2B,GACrDA,mBAAmB,IAAA,CAAK;AAC5B,CAAA;AAEO,IAAM,eAAA,GAAkB,CAC7B,eAAA,KACiB;AACjB,EAAA,IAAI,CAAC,eAAA,EAAiB,OAAOA,kBAAAA,CAAmB,IAAA,CAAK,IAAA;AACrD,EAAA,OACE,wBAAA,CAAyB,eAAe,CAAA,IAAKA,kBAAAA,CAAmB,IAAA,CAAK,IAAA;AAEzE,CAAA;AC1CO,IAAMK,qBAAAA,GAAuB,CAAC,IAAA,KAAgC;AACnE,EAAA,MAAM,WAAA,GAAc,wBAAwB,IAAI,CAAA;AAChD,EAAA,IAAI,aAAa,OAAO,WAAA;AAExB,EAAA,MAAM,UAAA,GAAa,uBAAuB,IAAI,CAAA;AAC9C,EAAA,IAAI,YAAY,OAAO,UAAA;AAEvB,EAAA,MAAM,WAAA,GAAc,wBAAwB,IAAI,CAAA;AAChD,EAAA,IAAI,aAAa,OAAO,WAAA;AAExB,EAAA,OAAO,EAAE,IAAA,EAAMJ,gBAAAA,CAAiB,IAAA,CAAK,IAAA,EAAK;AAC5C,CAAA;AAEA,IAAM,uBAAA,GAA0B,CAAC,IAAA,KAAuC;AACtE,EAAA,IACE,IAAA,CAAK,sBAAA,KAA2B,MAAA,IAChC,IAAA,CAAK,4BAA4B,MAAA,EACjC;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,iBAAiB,IAAA,CAAK,OAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,KAAA;AAAA,QAC5B,KAAK,IAAA,CAAK,sBAAA;AAAA,QACV,KAAK,IAAA,CAAK;AAAA;AACZ,KACF;AAAA,EACF;AAEA,EAAA,IACE,IAAA,CAAK,oBAAA,KAAyB,MAAA,IAC9B,IAAA,CAAK,0BAA0B,MAAA,EAC/B;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,OAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,KAAA;AAAA,QAC5B,KAAK,IAAA,CAAK,oBAAA;AAAA,QACV,KAAK,IAAA,CAAK;AAAA;AACZ,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,IAAM,sBAAA,GAAyB,CAAC,IAAA,KAAuC;AACrE,EAAA,IAAI,IAAA,CAAK,sBAAsB,MAAA,EAAW;AACxC,IAAA,OAAO;AAAA,MACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,OAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,GAAA;AAAA,QAC5B,OAAO,IAAA,CAAK;AAAA;AACd,KACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,IAAM,uBAAA,GAA0B,CAAC,IAAA,KAAuC;AACtE,EAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,IAAA,OAAO;AAAA,MACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,OAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,GAAA;AAAA,QAC5B,OAAO,IAAA,CAAK;AAAA;AACd,KACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;ACrEO,IAAMI,uBAAAA,GAAyB,CAAC,IAAA,KAAgC;AACrE,EAAA,MAAM,WAAA,GAAc,0BAA0B,IAAI,CAAA;AAClD,EAAA,IAAI,aAAa,OAAO,WAAA;AAExB,EAAA,MAAM,UAAA,GAAa,yBAAyB,IAAI,CAAA;AAChD,EAAA,IAAI,YAAY,OAAO,UAAA;AAEvB,EAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,IAAA,OAAO,qBAAA,CAAsB,KAAK,WAAW,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,EAAE,IAAA,EAAML,gBAAAA,CAAiB,IAAA,CAAK,IAAA,EAAK;AAC5C,CAAA;AAEA,IAAM,yBAAA,GAA4B,CAAC,IAAA,KAAuC;AACxE,EAAA,IACE,IAAA,CAAK,wBAAA,KAA6B,MAAA,IAClC,IAAA,CAAK,8BAA8B,MAAA,EACnC;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,iBAAiB,IAAA,CAAK,UAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,KAAA;AAAA,QAC5B,KAAK,IAAA,CAAK,wBAAA;AAAA,QACV,KAAK,IAAA,CAAK;AAAA;AACZ,KACF;AAAA,EACF;AAEA,EAAA,IACE,IAAA,CAAK,oBAAA,KAAyB,MAAA,IAC9B,IAAA,CAAK,0BAA0B,MAAA,EAC/B;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,UAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,KAAA;AAAA,QAC5B,KAAK,IAAA,CAAK,oBAAA;AAAA,QACV,KAAK,IAAA,CAAK;AAAA;AACZ,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,IAAM,wBAAA,GAA2B,CAAC,IAAA,KAAuC;AACvE,EAAA,IAAI,IAAA,CAAK,iBAAiB,MAAA,EAAW;AAGnC,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,CAAA,IAAK,IAAA,CAAK,gBAAgB,CAAA,EAAG;AACpD,MAAA,OAAO;AAAA,QACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,UAAA;AAAA,QAC5B,KAAA,EAAO;AAAA,UACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,IAAA;AAAA,UAC5B,OAAO,IAAA,CAAK;AAAA;AACd,OACF;AAAA,IACF;AAEA,IAAA,OAAO,qBAAA,CAAsB,KAAK,YAAY,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,IAAM,qBAAA,GAAwB,CAAC,KAAA,KAA0B;AAIvD,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,OAAO;AAAA,MACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,UAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,GAAA;AAAA,QAC5B,OAAO,KAAA,GAAQ;AAAA;AACjB,KACF;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO;AAAA,MACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,UAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,WAAA;AAAA,QAC5B;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAMD,gBAAAA,CAAiB,IAAA,CAAK,IAAA,EAAK;AAC5C,CAAA;AC1FO,IAAMM,kBAAAA,GAAoB,CAAC,IAAA,KAAgC;AAChE,EAAA,MAAM,WAAA,GAAc,qBAAqB,IAAI,CAAA;AAC7C,EAAA,IAAI,aAAa,OAAO,WAAA;AAExB,EAAA,MAAM,UAAA,GAAa,oBAAoB,IAAI,CAAA;AAC3C,EAAA,IAAI,YAAY,OAAO,UAAA;AAEvB,EAAA,MAAM,WAAA,GAAc,qBAAqB,IAAI,CAAA;AAC7C,EAAA,IAAI,aAAa,OAAO,WAAA;AAExB,EAAA,OAAO,EAAE,IAAA,EAAMN,gBAAAA,CAAiB,IAAA,CAAK,IAAA,EAAK;AAC5C,CAAA;AAEA,IAAM,oBAAA,GAAuB,CAAC,IAAA,KAAuC;AACnE,EAAA,IACE,IAAA,CAAK,oBAAA,KAAyB,MAAA,IAC9B,IAAA,CAAK,0BAA0B,MAAA,EAC/B;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,iBAAiB,IAAA,CAAK,IAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,KAAA;AAAA,QAC5B,KAAK,IAAA,CAAK,oBAAA;AAAA,QACV,KAAK,IAAA,CAAK;AAAA;AACZ,KACF;AAAA,EACF;AAEA,EAAA,IACE,IAAA,CAAK,oBAAA,KAAyB,MAAA,IAC9B,IAAA,CAAK,0BAA0B,MAAA,EAC/B;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,IAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,KAAA;AAAA,QAC5B,KAAK,IAAA,CAAK,oBAAA;AAAA,QACV,KAAK,IAAA,CAAK;AAAA;AACZ,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,IAAM,mBAAA,GAAsB,CAAC,IAAA,KAAuC;AAClE,EAAA,IAAI,IAAA,CAAK,oBAAoB,MAAA,EAAW;AAGtC,IAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,CAAA,IAAK,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAC1D,MAAA,OAAO;AAAA,QACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,IAAA;AAAA,QAC5B,KAAA,EAAO;AAAA,UACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,IAAA;AAAA,UAC5B,OAAO,IAAA,CAAK;AAAA;AACd,OACF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,EAAG;AAC5B,MAAA,OAAO;AAAA,QACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,IAAA;AAAA,QAC5B,KAAA,EAAO;AAAA,UACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,GAAA;AAAA,UAC5B,OAAO,IAAA,CAAK;AAAA;AACd,OACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,IAAM,oBAAA,GAAuB,CAAC,IAAA,KAAuC;AACnE,EAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,IAAA,OAAO;AAAA,MACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,IAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,GAAA;AAAA,QAC5B,OAAO,IAAA,CAAK;AAAA;AACd,KACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;;;AClFO,IAAM,qBAAA,GAAwB,CACnC,KAAA,KACoD;AACpD,EAAA,IAAI,SAAS,GAAA,EAAM;AACjB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,KAAA,GAAQ;AAAA,KACjB;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN;AAAA,GACF;AACF,CAAA;AAQO,IAAM,iBAAA,GAAoB,CAAC,KAAA,KAAkB;AAClD,EAAA,IAAI,QAAQ,GAAA,EAAM;AAChB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,KAAA,GAAQ;AAAA,KACjB;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;;;ACpCO,IAAMM,mBAAAA,GAAqB,CAAC,IAAA,KAAgC;AACjE,EAAA,MAAM,WAAA,GAAc,sBAAsB,IAAI,CAAA;AAC9C,EAAA,IAAI,aAAa,OAAO,WAAA;AAExB,EAAA,MAAM,UAAA,GAAa,qBAAqB,IAAI,CAAA;AAC5C,EAAA,IAAI,YAAY,OAAO,UAAA;AAEvB,EAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,WAAW,CAAA;AACrD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO;AAAA,QACL,IAAA,EAAMP,iBAAiB,IAAA,CAAK,KAAA;AAAA,QAC5B,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAMA,gBAAAA,CAAiB,IAAA,CAAK,IAAA,EAAK;AAC5C,CAAA;AAEA,IAAM,qBAAA,GAAwB,CAAC,IAAA,KAAuC;AACpE,EAAA,IACE,IAAA,CAAK,oBAAA,KAAyB,MAAA,IAC9B,IAAA,CAAK,0BAA0B,MAAA,EAC/B;AACA,IAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,IAAA,CAAK,oBAAoB,CAAA;AAChE,IAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,IAAA,CAAK,qBAAqB,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,iBAAiB,IAAA,CAAK,KAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,KAAA;AAAA,QAC5B,KAAK,QAAA,CAAS,KAAA;AAAA,QACd,KAAK,QAAA,CAAS;AAAA;AAChB,KACF;AAAA,EACF;AAEA,EAAA,IACE,IAAA,CAAK,oBAAA,KAAyB,MAAA,IAC9B,IAAA,CAAK,0BAA0B,MAAA,EAC/B;AACA,IAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,IAAA,CAAK,oBAAoB,CAAA;AAChE,IAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,IAAA,CAAK,qBAAqB,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,KAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,KAAA;AAAA,QAC5B,KAAK,QAAA,CAAS,KAAA;AAAA,QACd,KAAK,QAAA,CAAS;AAAA;AAChB,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,IAAM,oBAAA,GAAuB,CAAC,IAAA,KAAuC;AACnE,EAAA,IAAI,IAAA,CAAK,oBAAoB,MAAA,EAAW;AAGtC,IAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,CAAA,IAAK,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAC1D,MAAA,OAAO;AAAA,QACL,IAAA,EAAMD,iBAAiB,IAAA,CAAK,KAAA;AAAA,QAC5B,KAAA,EAAO;AAAA,UACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,IAAA;AAAA,UAC5B,OAAO,IAAA,CAAK;AAAA;AACd,OACF;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,eAAe,CAAA;AACzD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,EAAE,IAAA,EAAMD,gBAAAA,CAAiB,IAAA,CAAK,KAAA,EAAO,OAAO,UAAA,EAAW;AAAA,IAChE;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AC9EO,IAAM,uBAAA,GAA0B,CAAC,IAAA,KAAgC;AACtE,EAAA,IAAI,IAAA,CAAK,qBAAqB,MAAA,EAAW;AACvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAMA,iBAAiB,IAAA,CAAK,WAAA;AAAA,MAC5B,KAAA,EAAO;AAAA,QACL,IAAA,EAAMC,iBAAiB,IAAA,CAAK,WAAA;AAAA,QAC5B,OAAO,IAAA,CAAK;AAAA;AACd,KACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,IAAA,EAAMD,gBAAAA,CAAiB,IAAA,CAAK,IAAA,EAAK;AAC5C,CAAA;;;ACLO,IAAM,gBAAA,GAAmB,CAAC,IAAA,KAAgC;AAC/D,EAAA,IAAI,IAAA,CAAK,UAAA,KAAe,mBAAA,CAAoB,IAAA,CAAK,KAAA,EAAO;AACtD,IAAA,OAAOO,oBAAmB,IAAI,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,IAAA,CAAK,UAAA,KAAe,mBAAA,CAAoB,IAAA,CAAK,SAAA,EAAW;AAC1D,IAAA,OAAOF,wBAAuB,IAAI,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,IAAA,CAAK,UAAA,KAAe,mBAAA,CAAoB,IAAA,CAAK,OAAA,EAAS;AACxD,IAAA,OAAOD,sBAAqB,IAAI,CAAA;AAAA,EAClC;AAEA,EAAA,IAAI,IAAA,CAAK,UAAA,KAAe,mBAAA,CAAoB,IAAA,CAAK,KAAA,EAAO;AACtD,IAAA,OAAOE,mBAAkB,IAAI,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,IAAA,CAAK,UAAA,KAAe,mBAAA,CAAoB,IAAA,CAAK,UAAA,EAAY;AAC3D,IAAA,OAAO,wBAAwB,IAAI,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,EAAE,IAAA,EAAMN,gBAAAA,CAAiB,IAAA,CAAK,IAAA,EAAK;AAC5C,CAAA;;;AC5BO,IAAM,SAAA,GAAY,CAAC,IAAA,KAAiC;AACzD,EAAA,OAAO,iBAAiB,IAAI,CAAA;AAC9B,CAAA;AAEO,IAAM,aAAA,GAAgB,CAC3B,aAAA,KACe;AACf,EAAA,IAAI,aAAA,KAAkB,oBAAoB,IAAA,CAAK,KAAA;AAC7C,IAAA,OAAOA,iBAAiB,IAAA,CAAK,KAAA;AAC/B,EAAA,IAAI,aAAA,KAAkB,oBAAoB,IAAA,CAAK,SAAA;AAC7C,IAAA,OAAOA,iBAAiB,IAAA,CAAK,UAAA;AAC/B,EAAA,IAAI,aAAA,KAAkB,oBAAoB,IAAA,CAAK,OAAA;AAC7C,IAAA,OAAOA,iBAAiB,IAAA,CAAK,OAAA;AAC/B,EAAA,IAAI,aAAA,KAAkB,oBAAoB,IAAA,CAAK,KAAA;AAC7C,IAAA,OAAOA,iBAAiB,IAAA,CAAK,IAAA;AAC/B,EAAA,IAAI,aAAA,KAAkB,oBAAoB,IAAA,CAAK,UAAA;AAC7C,IAAA,OAAOA,iBAAiB,IAAA,CAAK,WAAA;AAC/B,EAAA,OAAOA,iBAAiB,IAAA,CAAK,IAAA;AAC/B,CAAA;;;AChBO,IAAM,OAAA,GAAU,CAAC,IAAA,EAAsB,KAAA,KAA+B;AAC3E,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAE7B,EAAA,MAAM,WAAA,GAA2B;AAAA,IAC/B,SAAA,EAAW,KAAK,YAAA,IAAgB,KAAA;AAAA,IAChC,MAAM,IAAA,CAAK,WAAA;AAAA,IACX,YAAA,EAAc,eAAA,CAAgB,IAAA,CAAK,YAAY,CAAA;AAAA,IAC/C,QAAA;AAAA,IACA,UAAA,EAAY,aAAA,CAAc,IAAA,CAAK,UAAU,CAAA;AAAA,IACzC,MAAA;AAAA,IACA,SAAA,EAAW,YAAA,CAAa,IAAA,CAAK,SAAS;AAAA,GACxC;AAEA,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,IAAA,WAAA,CAAY,QAAQ,IAAA,CAAK,KAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,IAAA,WAAA,CAAY,SAAA,GAAY,iBAAA,CAAkB,IAAA,CAAK,SAAS,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,WAAA;AACT,CAAA;AAEA,IAAM,YAAA,GAAe,CAAC,SAAA,KAAyD;AAC7E,EAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AAEvB,EAAA,MAAM,UAAA,GAAa,UAAU,WAAA,EAAY;AACzC,EAAA,MAAM,mBAAmB,eAAA,CAAgB,OAAA;AAEzC,EAAA,IAAI,gBAAA,CAAiB,QAAA,CAAS,UAAuB,CAAA,EAAG;AACtD,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;;;ACtCO,IAAM,yBAAA,GAA4B,CACvC,YAAA,KACgB;AAChB,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,IAAA,GAAO,aAAa,CAAC,CAAA;AAC3B,IAAA,IACE,IAAA,CAAK,YAAA,KAAiB,qBAAA,CAAsB,IAAA,CAAK,qBAAA,EACjD;AACA,MAAA,MAAM,UAAA,GAAc,KAAK,YAAA,IAAgB,CAAA;AACzC,MAAA,KAAA,IAAS,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACnC,QAAA,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT,CAAA;AAEO,IAAM,iBAAA,GAAoB,CAC/B,YAAA,EACA,qBAAA,KACyC;AACzC,EAAA,MAAM,QAAQ,EAAC;AAEf,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,IAAA,GAAO,aAAa,CAAC,CAAA;AAE3B,IAAA,IACE,KAAK,YAAA,KAAiB,qBAAA,CAAsB,IAAA,CAAK,qBAAA,IACjD,KAAK,WAAA,EACL;AACA,MAAA,MAAM,eAAA,GAAkB,oBAAA,CAAqB,IAAA,EAAM,YAAA,EAAc,CAAC,CAAA;AAClE,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAAA,IAC5B,CAAA,MAAA,IAAW,CAAC,qBAAA,CAAsB,GAAA,CAAI,CAAC,CAAA,EAAG;AACxC,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AAEO,IAAM,oBAAA,GAAuB,CAClC,IAAA,EACA,YAAA,EACA,YAAA,KACoB;AACpB,EAAA,MAAM,cAAc,IAAA,CAAK,WAAA;AACzB,EAAA,MAAM,UAAA,GAAc,KAAK,YAAA,IAAgB,CAAA;AACzC,EAAA,MAAM,gBAAgB,EAAC;AAEvB,EAAA,KAAA,IAAS,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,YAAA,EAAc,CAAA,EAAA,EAAK;AAC9C,IAAA,aAAA,CAAc,KAAK,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF,CAAA;;;ACrDO,IAAM,UAAA,GAAa,CACxB,UAAA,EACA,YAAA,EACA,MAAA,KACY;AACZ,EAAA,MAAA,CAAO,MAAM,uBAAA,EAAyB;AAAA,IACpC,WAAW,YAAA,CAAa;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,qBAAA,GAAwB,0BAA0B,YAAY,CAAA;AACpE,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,YAAA,EAAc,qBAAqB,CAAA;AAEnE,EAAA,MAAM,OAAA,GAAmB;AAAA,IACvB,MAAM,UAAA,EAAY,OAAA;AAAA,IAClB,KAAA,EAAO,YAAA,CAAa,UAAA,EAAY,KAAK,CAAA;AAAA,IACrC;AAAA,GACF;AAEA,EAAA,IAAI,UAAA,EAAY,aAAa,MAAA,EAAW;AACtC,IAAA,OAAA,CAAQ,QAAA,GAAW,gBAAA,CAAiB,UAAA,CAAW,QAAQ,CAAA;AAAA,EACzD;AAEA,EAAA,IAAI,UAAA,EAAY,eAAe,MAAA,EAAW;AACxC,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,UAAA,CAAW,cAAc,CAAA;AACzD,IAAA,OAAA,CAAQ,UAAA,GAAa,qBAAA,CAAsB,UAAA,CAAW,UAAA,EAAY,IAAI,CAAA;AACtE,IAAA,OAAA,CAAQ,cAAA,GAAiB,QAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,OAAA;AACT,CAAA;ACvBA,IAAM,WAAA,GAAc,CAClB,MAAA,EACA,MAAA,EACA,MAAA,KACS;AACT,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,OAAA,GAAU,6CAAA;AAChB,IAAA,IAAI,MAAA,EAAQ,MAAMG,qBAAAA,CAAsB,OAAO,CAAA;AAC/C,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,EACrB;AACF,CAAA;AAEA,IAAM,eAAA,GAAkB,CACtB,UAAA,EACA,MAAA,EACA,MAAA,KACS;AACT,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,OAAA,GAAU,8CAAA;AAChB,IAAA,IAAI,MAAA,EAAQ,MAAMA,qBAAAA,CAAsB,OAAO,CAAA;AAC/C,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,EACrB;AACF,CAAA;AAMO,IAAM,gBAAA,GAAmB,CAAA,GAC3B,CAAC,MAAA,EAAQ,UAAA,EAAY,UAAU,MAAA,EAAQ,OAAA,GAAU,EAAE,CAAA,KAC7C;AACT,EAAA,MAAM,EAAE,MAAA,GAAS,IAAA,EAAK,GAAI,OAAA;AAC1B,EAAA,WAAA,CAAY,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAClC,EAAA,eAAA,CAAgB,UAAA,EAAY,QAAQ,MAAM,CAAA;AAE1C,EAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,YAAY,CAAA;AACtE,EAAA,IAAI,eAAA,IAAmB,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACjD,IAAA,MAAA,CAAO,KAAK,kDAAA,EAAoD;AAAA,MAC9D,OAAO,eAAA,CAAgB;AAAA,KACxB,CAAA;AAAA,EACH;AACF,CAAA;;;ACjDA,IAAMK,YAAAA,GAAc,KAAA;AAKb,IAAM,mBAAA,GAAsB,CACjC,QAAA,EACA,MAAA,KACQ;AACR,EAAA,MAAM,SAAS,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,WAAW,IAAI,CAAC,CAAA;AACjE,EAAA,MAAM,aAAa,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,YAAY,IAAI,CAAC,CAAA;AACtE,EAAA,MAAM,eACJ,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,gBAAgB,KAAK,EAAC;AAE1D,EAAA,gBAAA,CAAiB,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,MAAM,CAAA;AAErD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,EAAQ,UAAA,EAAY,MAAM,CAAA;AACvD,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA;AAC3D,EAAA,MAAM,aAAA,GAAgB,oBAAA,CAAqB,QAAA,EAAU,MAAM,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,OAAA,EAASA,YAAAA;AAAA,IACT,IAAA,EAAMC,eAAe,IAAA,CAAK,kBAAA;AAAA,IAC1B,QAAA;AAAA,IACA,UAAA,EAAY,EAAE,kBAAA,EAAoB,OAAA,EAAS,KAAK,aAAA;AAAc,GAChE;AACF,CAAA;;;ACrBA,IAAM,cAAA,GAAiB,CAAC,QAAA,KAAoC;AAC1D,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,YAAY,CAAA;AAClE,EAAA,IAAI,WAAA,IAAe,YAAY,MAAA,GAAS,CAAA;AACtC,IAAA,OAAOA,eAAe,IAAA,CAAK,kBAAA;AAE7B,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,YAAY,CAAA;AAClE,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,mBAAA,CAAoB,IAAA,CAAK,WAAW,CAAA;AAChE,EAAA,IACG,eAAe,WAAA,CAAY,MAAA,GAAS,KACpC,UAAA,IAAc,UAAA,CAAW,SAAS,CAAA,EACnC;AACA,IAAA,OAAOA,eAAe,IAAA,CAAK,iBAAA;AAAA,EAC7B;AAEA,EAAA,OAAOA,eAAe,IAAA,CAAK,kBAAA;AAC7B,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAC9B,QAAA,EACA,MAAA,KACQ;AACR,EAAA,MAAA,CAAO,MAAM,6BAAA,EAA+B;AAAA,IAC1C,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE;AAAA,GACrC,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,eAAe,QAAQ,CAAA;AACxC,EAAA,MAAA,CAAO,KAAA,CAAM,oBAAA,EAAsB,EAAE,QAAA,EAAU,CAAA;AAE/C,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAKA,eAAe,IAAA,CAAK,iBAAA;AACvB,MAAA,OAAO,oBAAA,CAAqB,UAAU,MAAM,CAAA;AAAA,IAC9C,KAAKA,eAAe,IAAA,CAAK,kBAAA;AAAA,IACzB;AACE,MAAA,OAAO,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAAA;AAEjD,CAAA;;;ACnCO,IAAM,wBAAA,GACX,CAAC,MAAA,KACD,OAAO,MAAA,KAAqC;AAC1C,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,MAAM,kBAAA,EAAoB,EAAE,UAAA,EAAY,MAAA,CAAO,QAAQ,CAAA;AAE9D,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAA,CAAO,MAAM,kBAAkB,CAAA;AAC/B,MAAA,MAAMN,sBAAsB,+BAA+B,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,SAAS,MAAA,CAAO,aAAA,CAAc,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAA;AACtD,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,MAAM,CAAA;AAClC,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,QAAQ,IAAA,EAAK;AAE1C,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,MAAA,EAAQ,CAAA;AACtD,MAAA,MAAMA,sBAAsB,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACxE;AAEA,IAAA,MAAA,CAAO,KAAK,8BAA8B,CAAA;AAC1C,IAAA,OAAO,gBAAA,CAAiB,UAAyB,MAAM,CAAA;AAAA,EACzD,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,iBAAA,EAAmB;AAC9D,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,KAAA,EAAO,CAAA;AAClD,IAAA,MAAMA,qBAAAA,CAAsB,4BAA4B,KAAK,CAAA;AAAA,EAC/D;AACF;AAEK,IAAM,wBAAA,GACX,CAAC,MAAA,KACD,OAAO,GAAA,KAAkC;AACvC,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,MAAM,qBAAqB,CAAA;AAElC,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,IAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,GAAA,EAAK,MAAM,CAAA;AAEjD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,MAAM,CAAA,gBAAA,EAAmB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI;AAAA,UAC1D,SAAU,OAAA,CAAiC;AAAA,SAC5C,CAAA;AACD,QAAA,OAAA,CAAQ,UAAU,OAAO,CAAA;AAAA,MAC3B,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,CAAA,wBAAA,EAA2B,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI;AAAA,UAC/C,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,UACxC;AAAA,SACD,CAAA;AACD,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAQ,KAAA,EAAM;AAC7B,IAAA,MAAA,CAAO,KAAK,iCAAiC,CAAA;AAC7C,IAAA,OAAO,IAAI,WAAW,MAAM,CAAA;AAAA,EAC9B,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,iBAAA,EAAmB;AAC9D,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,MAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,KAAA,EAAO,CAAA;AAClD,IAAA,MAAMA,qBAAAA,CAAsB,4BAA4B,KAAK,CAAA;AAAA,EAC/D;AACF;;;ACtEK,IAAM,kBAAkB,CAAC,MAAA,KAC9B,wBAAA,CAAyB,MAAA,IAAU,qBAAqB;AAEnD,IAAM,kBAAkB,CAAC,MAAA,KAC9B,wBAAA,CAAyB,MAAA,IAAU,qBAAqB;AAEnD,IAAM,YAA0B,eAAA;AAChC,IAAM,YAA0B,eAAA","file":"index.js","sourcesContent":["/**\n * FIT Message Numbers from Garmin FIT SDK Profile\n * Source: @garmin/fitsdk Profile.MesgNum\n */\n\nexport const FIT_MESSAGE_NUMBERS = {\n FILE_ID: 0,\n WORKOUT: 26,\n WORKOUT_STEP: 27,\n} as const;\n","import { z } from \"zod\";\n\n/**\n * FIT file type enum schema\n *\n * Defines the type of data contained in the FIT file.\n * Used in FILE_ID message to identify file purpose.\n *\n * @see https://developer.garmin.com/fit/file-types/\n */\nexport const fitFileTypeSchema = z.enum([\n \"device\",\n \"settings\",\n \"sport\",\n \"activity\",\n \"workout\",\n \"course\",\n \"schedules\",\n \"weight\",\n \"totals\",\n \"goals\",\n \"bloodPressure\",\n \"monitoringA\",\n \"activitySummary\",\n \"monitoringDaily\",\n \"monitoringB\",\n \"segment\",\n \"segmentList\",\n \"exdConfiguration\",\n]);\n\n/**\n * TypeScript type for FIT file type\n */\nexport type FitFileType = z.infer<typeof fitFileTypeSchema>;\n\n/**\n * Bidirectional mapping: FIT file type → numeric value\n *\n * Maps string file type to FIT protocol numeric values.\n */\nexport const FIT_FILE_TYPE_TO_NUMBER: Record<FitFileType, number> = {\n device: 1,\n settings: 2,\n sport: 3,\n activity: 4,\n workout: 5,\n course: 6,\n schedules: 7,\n weight: 9,\n totals: 10,\n goals: 11,\n bloodPressure: 14,\n monitoringA: 15,\n activitySummary: 20,\n monitoringDaily: 28,\n monitoringB: 32,\n segment: 34,\n segmentList: 35,\n exdConfiguration: 40,\n};\n\n/**\n * Bidirectional mapping: numeric value → FIT file type\n *\n * Maps FIT protocol numeric values to string file type.\n */\nexport const NUMBER_TO_FIT_FILE_TYPE: Record<number, FitFileType> = {\n 1: \"device\",\n 2: \"settings\",\n 3: \"sport\",\n 4: \"activity\",\n 5: \"workout\",\n 6: \"course\",\n 7: \"schedules\",\n 9: \"weight\",\n 10: \"totals\",\n 11: \"goals\",\n 14: \"bloodPressure\",\n 15: \"monitoringA\",\n 20: \"activitySummary\",\n 28: \"monitoringDaily\",\n 32: \"monitoringB\",\n 34: \"segment\",\n 35: \"segmentList\",\n 40: \"exdConfiguration\",\n};\n","import { z } from \"zod\";\n\nexport const fitSubSportSchema = z.enum([\n \"generic\",\n \"treadmill\",\n \"street\",\n \"trail\",\n \"track\",\n \"spin\",\n \"indoorCycling\",\n \"road\",\n \"mountain\",\n \"downhill\",\n \"recumbent\",\n \"cyclocross\",\n \"handCycling\",\n \"trackCycling\",\n \"indoorRowing\",\n \"elliptical\",\n \"stairClimbing\",\n \"lapSwimming\",\n \"openWater\",\n \"flexibilityTraining\",\n \"strengthTraining\",\n \"warmUp\",\n \"match\",\n \"exercise\",\n \"challenge\",\n \"indoorSkiing\",\n \"cardioTraining\",\n \"indoorWalking\",\n \"eBikeFitness\",\n \"bmx\",\n \"casualWalking\",\n \"speedWalking\",\n \"bikeToRunTransition\",\n \"runToBikeTransition\",\n \"swimToBikeTransition\",\n \"atv\",\n \"motocross\",\n \"backcountry\",\n \"resort\",\n \"rcDrone\",\n \"wingsuit\",\n \"whitewater\",\n \"skateSkiing\",\n \"yoga\",\n \"pilates\",\n \"indoorRunning\",\n \"gravelCycling\",\n \"eBikeMountain\",\n \"commuting\",\n \"mixedSurface\",\n \"navigate\",\n \"trackMe\",\n \"map\",\n \"singleGasDiving\",\n \"multiGasDiving\",\n \"gaugeDiving\",\n \"apneaDiving\",\n \"apneaHunting\",\n \"virtualActivity\",\n \"obstacle\",\n \"all\",\n]);\n\nexport type FitSubSport = z.infer<typeof fitSubSportSchema>;\n","import { type SubSport, subSportSchema } from \"@kaiord/core\";\n\nimport { type FitSubSport, fitSubSportSchema } from \"../schemas/fit-sub-sport\";\n\nconst FIT_TO_KRD_SUB_SPORT_MAP: Record<FitSubSport, SubSport> = {\n generic: \"generic\",\n treadmill: \"treadmill\",\n street: \"street\",\n trail: \"trail\",\n track: \"track\",\n spin: \"spin\",\n indoorCycling: \"indoor_cycling\",\n road: \"road\",\n mountain: \"mountain\",\n downhill: \"downhill\",\n recumbent: \"recumbent\",\n cyclocross: \"cyclocross\",\n handCycling: \"hand_cycling\",\n trackCycling: \"track_cycling\",\n indoorRowing: \"indoor_rowing\",\n elliptical: \"elliptical\",\n stairClimbing: \"stair_climbing\",\n lapSwimming: \"lap_swimming\",\n openWater: \"open_water\",\n flexibilityTraining: \"flexibility_training\",\n strengthTraining: \"strength_training\",\n warmUp: \"warm_up\",\n match: \"match\",\n exercise: \"exercise\",\n challenge: \"challenge\",\n indoorSkiing: \"indoor_skiing\",\n cardioTraining: \"cardio_training\",\n indoorWalking: \"indoor_walking\",\n eBikeFitness: \"e_bike_fitness\",\n bmx: \"bmx\",\n casualWalking: \"casual_walking\",\n speedWalking: \"speed_walking\",\n bikeToRunTransition: \"bike_to_run_transition\",\n runToBikeTransition: \"run_to_bike_transition\",\n swimToBikeTransition: \"swim_to_bike_transition\",\n atv: \"atv\",\n motocross: \"motocross\",\n backcountry: \"backcountry\",\n resort: \"resort\",\n rcDrone: \"rc_drone\",\n wingsuit: \"wingsuit\",\n whitewater: \"whitewater\",\n skateSkiing: \"skate_skiing\",\n yoga: \"yoga\",\n pilates: \"pilates\",\n indoorRunning: \"indoor_running\",\n gravelCycling: \"gravel_cycling\",\n eBikeMountain: \"e_bike_mountain\",\n commuting: \"commuting\",\n mixedSurface: \"mixed_surface\",\n navigate: \"navigate\",\n trackMe: \"track_me\",\n map: \"map\",\n singleGasDiving: \"single_gas_diving\",\n multiGasDiving: \"multi_gas_diving\",\n gaugeDiving: \"gauge_diving\",\n apneaDiving: \"apnea_diving\",\n apneaHunting: \"apnea_hunting\",\n virtualActivity: \"virtual_activity\",\n obstacle: \"obstacle\",\n all: \"all\",\n};\n\nconst KRD_TO_FIT_SUB_SPORT_MAP: Record<SubSport, FitSubSport> =\n Object.fromEntries(\n Object.entries(FIT_TO_KRD_SUB_SPORT_MAP).map(([fit, krd]) => [krd, fit])\n ) as Record<SubSport, FitSubSport>;\n\nexport const mapSubSportToKrd = (fitSubSport: unknown): SubSport => {\n const result = fitSubSportSchema.safeParse(fitSubSport);\n\n if (!result.success) {\n return subSportSchema.enum.generic;\n }\n\n return FIT_TO_KRD_SUB_SPORT_MAP[result.data] || subSportSchema.enum.generic;\n};\n\nexport const mapSubSportToFit = (krdSubSport: unknown): FitSubSport => {\n const result = subSportSchema.safeParse(krdSubSport);\n\n if (!result.success) {\n return fitSubSportSchema.enum.generic;\n }\n\n return (\n KRD_TO_FIT_SUB_SPORT_MAP[result.data] || fitSubSportSchema.enum.generic\n );\n};\n","import { Profile } from \"@garmin/fitsdk\";\nimport type { KRD } from \"@kaiord/core\";\nimport type { RepetitionBlock, Workout, WorkoutStep } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\nimport { isRepetitionBlock } from \"@kaiord/core\";\n\nimport { FIT_FILE_TYPE_TO_NUMBER } from \"../schemas/fit-file-type\";\nimport { mapSubSportToFit } from \"../sub-sport/sub-sport.mapper\";\n\nconst DEFAULT_MANUFACTURER = \"garmin\";\n\n/**\n * Maps KRD manufacturer string to valid FIT Profile manufacturer enum value.\n * Uses fuzzy matching (case-insensitive, prefix matching).\n */\nconst mapManufacturer = (\n manufacturer: string | undefined,\n logger: Logger\n): string => {\n if (!manufacturer) {\n return DEFAULT_MANUFACTURER;\n }\n\n const manufacturerEnum = Profile.types.manufacturer;\n const manufacturerValues = Object.values(manufacturerEnum);\n const normalized = manufacturer.toLowerCase();\n\n const matched = manufacturerValues.find(\n (value) =>\n value.toLowerCase() === normalized ||\n value.toLowerCase().startsWith(normalized) ||\n normalized.startsWith(value.toLowerCase())\n );\n\n if (matched) return matched;\n\n logger.warn(\n `Unknown manufacturer \"${manufacturer}\", using fallback \"${DEFAULT_MANUFACTURER}\"`,\n { original: manufacturer, fallback: DEFAULT_MANUFACTURER }\n );\n return DEFAULT_MANUFACTURER;\n};\n\nexport const convertMetadataToFileId = (\n krd: KRD,\n logger: Logger\n): Record<string, unknown> => {\n logger.debug(\"Converting metadata to file_id message\");\n\n const fileType =\n krd.type === \"structured_workout\"\n ? \"workout\"\n : krd.type === \"recorded_activity\"\n ? \"activity\"\n : krd.type === \"course\"\n ? \"course\"\n : \"workout\";\n\n const fileId: Record<string, unknown> = {\n type: FIT_FILE_TYPE_TO_NUMBER[fileType] ?? FIT_FILE_TYPE_TO_NUMBER.workout,\n timeCreated: new Date(krd.metadata.created),\n manufacturer: mapManufacturer(krd.metadata.manufacturer, logger),\n };\n\n if (krd.metadata.product !== undefined) {\n const productNumber = parseInt(krd.metadata.product, 10);\n if (!isNaN(productNumber)) {\n fileId.product = productNumber;\n }\n }\n\n if (krd.metadata.serialNumber) {\n const serialNumber = parseInt(krd.metadata.serialNumber, 10);\n if (!isNaN(serialNumber)) {\n fileId.serialNumber = serialNumber;\n }\n }\n\n return fileId;\n};\n\nexport const convertWorkoutMetadata = (\n workout: Workout,\n logger: Logger\n): Record<string, unknown> => {\n logger.debug(\"Converting workout metadata\");\n\n const numValidSteps = countValidSteps(workout.steps);\n\n const workoutMesg: Record<string, unknown> = {\n wktName: workout.name,\n sport: workout.sport,\n numValidSteps,\n };\n\n if (workout.subSport !== undefined) {\n workoutMesg.subSport = mapSubSportToFit(workout.subSport);\n }\n\n if (workout.poolLength !== undefined) {\n workoutMesg.poolLength = workout.poolLength;\n workoutMesg.poolLengthUnit = 0;\n }\n\n return workoutMesg;\n};\n\nconst countValidSteps = (\n steps: Array<WorkoutStep | RepetitionBlock>\n): number => {\n let count = 0;\n for (const step of steps) {\n if (isRepetitionBlock(step)) {\n count += step.steps.length + 1;\n } else {\n count += 1;\n }\n }\n return count;\n};\n","import { z } from \"zod\";\n\nexport const fitDurationTypeSchema = z.enum([\n \"time\",\n \"distance\",\n \"repeatUntilStepsCmplt\",\n \"repeatUntilHrGreaterThan\",\n \"hrLessThan\",\n \"hrGreaterThan\",\n \"calories\",\n \"powerLessThan\",\n \"powerGreaterThan\",\n \"repeatUntilTime\",\n \"repeatUntilDistance\",\n \"repeatUntilCalories\",\n \"repeatUntilHrLessThan\",\n \"repeatUntilPowerLessThan\",\n \"repeatUntilPowerGreaterThan\",\n \"open\",\n]);\n\nexport type FitDurationType = z.infer<typeof fitDurationTypeSchema>;\n","import { z } from \"zod\";\n\nexport const fitTargetTypeSchema = z.enum([\n \"power\",\n \"heartRate\",\n \"cadence\",\n \"speed\",\n \"swimStroke\",\n \"open\",\n]);\n\nexport type FitTargetType = z.infer<typeof fitTargetTypeSchema>;\n","import { z } from \"zod\";\n\nexport const fitEquipmentSchema = z.enum([\n \"none\",\n \"swimFins\",\n \"swimKickboard\",\n \"swimPaddles\",\n \"swimPullBuoy\",\n \"swimSnorkel\",\n]);\n\nexport type FitEquipment = z.infer<typeof fitEquipmentSchema>;\n","import { type Equipment, equipmentSchema } from \"@kaiord/core\";\n\nimport {\n type FitEquipment,\n fitEquipmentSchema,\n} from \"../schemas/fit-equipment\";\n\nconst FIT_TO_KRD_EQUIPMENT_MAP: Record<FitEquipment, Equipment> = {\n none: \"none\",\n swimFins: \"swim_fins\",\n swimKickboard: \"swim_kickboard\",\n swimPaddles: \"swim_paddles\",\n swimPullBuoy: \"swim_pull_buoy\",\n swimSnorkel: \"swim_snorkel\",\n};\n\nconst KRD_TO_FIT_EQUIPMENT_MAP: Record<Equipment, FitEquipment> =\n Object.fromEntries(\n Object.entries(FIT_TO_KRD_EQUIPMENT_MAP).map(([fit, krd]) => [krd, fit])\n ) as Record<Equipment, FitEquipment>;\n\nexport const mapEquipmentToKrd = (fitEquipment: unknown): Equipment => {\n const result = fitEquipmentSchema.safeParse(fitEquipment);\n\n if (!result.success) {\n return equipmentSchema.enum.none;\n }\n\n return FIT_TO_KRD_EQUIPMENT_MAP[result.data] || equipmentSchema.enum.none;\n};\n\nexport const mapEquipmentToFit = (krdEquipment: unknown): FitEquipment => {\n const result = equipmentSchema.safeParse(krdEquipment);\n\n if (!result.success) {\n return fitEquipmentSchema.enum.none;\n }\n\n return KRD_TO_FIT_EQUIPMENT_MAP[result.data] || fitEquipmentSchema.enum.none;\n};\n","import type { Duration } from \"@kaiord/core\";\nimport { durationTypeSchema } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../../schemas/fit-duration\";\n\nexport const convertConditionalDuration = (\n duration: Duration,\n message: Record<string, unknown>\n): boolean => {\n if (duration.type === durationTypeSchema.enum.heart_rate_less_than) {\n message.durationType = fitDurationTypeSchema.enum.hrLessThan;\n message.durationHr = duration.bpm;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.power_less_than) {\n message.durationType = fitDurationTypeSchema.enum.powerLessThan;\n message.durationPower = duration.watts;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.power_greater_than) {\n message.durationType = fitDurationTypeSchema.enum.powerGreaterThan;\n message.durationPower = duration.watts;\n return true;\n }\n\n return false;\n};\n","import type { Duration } from \"@kaiord/core\";\nimport { durationTypeSchema } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../../schemas/fit-duration\";\n\nexport const convertRepeatDuration = (\n duration: Duration,\n message: Record<string, unknown>\n): boolean => {\n if (duration.type === durationTypeSchema.enum.repeat_until_time) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilTime;\n message.durationTime = duration.seconds;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.repeat_until_distance) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilDistance;\n message.durationDistance = duration.meters;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.repeat_until_calories) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilCalories;\n message.durationCalories = duration.calories;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n return false;\n};\n","import type { Duration } from \"@kaiord/core\";\nimport { durationTypeSchema } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../../schemas/fit-duration\";\n\nexport const convertRepeatHrPowerDuration = (\n duration: Duration,\n message: Record<string, unknown>\n): boolean => {\n if (\n duration.type ===\n durationTypeSchema.enum.repeat_until_heart_rate_greater_than\n ) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilHrGreaterThan;\n message.durationHr = duration.bpm;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n if (\n duration.type === durationTypeSchema.enum.repeat_until_heart_rate_less_than\n ) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilHrLessThan;\n message.durationHr = duration.bpm;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.repeat_until_power_less_than) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilPowerLessThan;\n message.durationPower = duration.watts;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n if (\n duration.type === durationTypeSchema.enum.repeat_until_power_greater_than\n ) {\n message.durationType =\n fitDurationTypeSchema.enum.repeatUntilPowerGreaterThan;\n message.durationPower = duration.watts;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n return false;\n};\n","import type { Duration } from \"@kaiord/core\";\nimport { durationTypeSchema } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../../schemas/fit-duration\";\n\nexport const convertSimpleDuration = (\n duration: Duration,\n message: Record<string, unknown>\n): boolean => {\n if (duration.type === durationTypeSchema.enum.time) {\n message.durationType = fitDurationTypeSchema.enum.time;\n message.durationTime = duration.seconds;\n message.durationValue = duration.seconds * 1000; // durationValue is in milliseconds\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.distance) {\n message.durationType = fitDurationTypeSchema.enum.distance;\n message.durationDistance = duration.meters;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.calories) {\n message.durationType = fitDurationTypeSchema.enum.calories;\n message.durationCalories = duration.calories;\n return true;\n }\n\n return false;\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../schemas/fit-duration\";\nimport { convertConditionalDuration } from \"./duration-converters/conditional\";\nimport { convertRepeatDuration } from \"./duration-converters/repeat\";\nimport { convertRepeatHrPowerDuration } from \"./duration-converters/repeat-hr-power\";\nimport { convertSimpleDuration } from \"./duration-converters/simple\";\n\nexport const convertDuration = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n const { duration } = step;\n\n if (convertSimpleDuration(duration, message)) return;\n if (convertConditionalDuration(duration, message)) return;\n if (convertRepeatDuration(duration, message)) return;\n if (convertRepeatHrPowerDuration(duration, message)) return;\n\n message.durationType = fitDurationTypeSchema.enum.open;\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\n\nexport const convertCadenceTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n message.targetType = fitTargetTypeSchema.enum.cadence;\n if (step.target.type !== targetTypeSchema.enum.cadence) return;\n\n const value = step.target.value;\n if (value.unit === targetUnitSchema.enum.range) {\n message.targetValue = 0;\n message.customTargetCadenceLow = value.min;\n message.customTargetCadenceHigh = value.max;\n } else {\n message.targetValue = 0;\n message.customTargetCadenceLow = value.value;\n message.customTargetCadenceHigh = value.value;\n }\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\n\nexport const convertHeartRateTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n message.targetType = fitTargetTypeSchema.enum.heartRate;\n if (step.target.type !== targetTypeSchema.enum.heart_rate) return;\n\n const value = step.target.value;\n if (value.unit === targetUnitSchema.enum.zone) {\n message.targetHrZone = value.value;\n } else if (value.unit === targetUnitSchema.enum.range) {\n message.targetValue = 0;\n message.customTargetHeartRateLow = value.min;\n message.customTargetHeartRateHigh = value.max;\n } else if (value.unit === targetUnitSchema.enum.bpm) {\n // Garmin encoding: Absolute bpm needs +100 offset\n message.targetValue = value.value + 100;\n } else if (value.unit === targetUnitSchema.enum.percent_max) {\n // Garmin encoding: Percentage max HR has no offset\n message.targetValue = value.value;\n }\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\n\nexport const convertPaceTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n message.targetType = fitTargetTypeSchema.enum.speed;\n if (step.target.type !== targetTypeSchema.enum.pace) return;\n\n const value = step.target.value;\n if (value.unit === targetUnitSchema.enum.zone) {\n message.targetSpeedZone = value.value;\n } else if (value.unit === targetUnitSchema.enum.range) {\n message.targetValue = 0;\n message.customTargetSpeedLow = value.min;\n message.customTargetSpeedHigh = value.max;\n } else {\n message.targetValue = 0;\n message.customTargetSpeedLow = value.value;\n message.customTargetSpeedHigh = value.value;\n }\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\n\nexport const convertPowerTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n message.targetType = fitTargetTypeSchema.enum.power;\n if (step.target.type !== targetTypeSchema.enum.power) return;\n\n const value = step.target.value;\n if (value.unit === targetUnitSchema.enum.zone) {\n message.targetPowerZone = value.value;\n } else if (value.unit === targetUnitSchema.enum.range) {\n message.targetValue = 0;\n message.customTargetPowerLow = value.min;\n message.customTargetPowerHigh = value.max;\n } else if (value.unit === targetUnitSchema.enum.watts) {\n // Garmin encoding: Absolute watts need +1000 offset\n message.targetValue = value.value + 1000;\n } else if (value.unit === targetUnitSchema.enum.percent_ftp) {\n // Garmin encoding: Percentage FTP has no offset\n message.targetValue = value.value;\n }\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\n\n/**\n * Converts KRD stroke_type target to FIT swimStroke target.\n *\n * The stroke value is already a FIT-compatible number (0-5):\n * 0 = freestyle, 1 = backstroke, 2 = breaststroke, 3 = butterfly, 4 = drill, 5 = mixed/IM\n */\nexport const convertStrokeTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n message.targetType = fitTargetTypeSchema.enum.swimStroke;\n if (step.target.type !== targetTypeSchema.enum.stroke_type) return;\n\n // Zod discriminated union guarantees value exists when type is stroke_type\n const strokeValue = step.target.value as { unit: string; value: number };\n\n message.targetValue = strokeValue.value;\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\nimport { convertCadenceTarget } from \"./krd-to-fit-target-cadence.mapper\";\nimport { convertHeartRateTarget } from \"./krd-to-fit-target-heart-rate.mapper\";\nimport { convertPaceTarget } from \"./krd-to-fit-target-pace.mapper\";\nimport { convertPowerTarget } from \"./krd-to-fit-target-power.mapper\";\nimport { convertStrokeTarget } from \"./krd-to-fit-target-stroke.converter\";\n\nexport const convertTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n if (step.target.type === targetTypeSchema.enum.open) {\n message.targetType = fitTargetTypeSchema.enum.open;\n return;\n }\n\n if (step.target.type === targetTypeSchema.enum.power) {\n convertPowerTarget(step, message);\n } else if (step.target.type === targetTypeSchema.enum.heart_rate) {\n convertHeartRateTarget(step, message);\n } else if (step.target.type === targetTypeSchema.enum.cadence) {\n convertCadenceTarget(step, message);\n } else if (step.target.type === targetTypeSchema.enum.pace) {\n convertPaceTarget(step, message);\n } else if (step.target.type === targetTypeSchema.enum.stroke_type) {\n convertStrokeTarget(step, message);\n }\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\nimport { createFitParsingError } from \"@kaiord/core\";\n\nimport { mapEquipmentToFit } from \"../equipment/equipment.mapper\";\nimport { convertDuration } from \"./krd-to-fit-duration.mapper\";\nimport { convertTarget } from \"./krd-to-fit-target.mapper\";\n\n/** FIT protocol maximum length for notes field */\nconst FIT_NOTES_MAX_LENGTH = 256;\n\nexport type TruncationBehavior = \"truncate\" | \"error\";\n\nexport type ConvertWorkoutStepOptions = {\n /** How to handle notes exceeding 256 characters. Default: \"truncate\" */\n notesTruncation?: TruncationBehavior;\n};\n\n/**\n * Converts a KRD workout step to a FIT workout step message.\n */\nexport const convertWorkoutStep = (\n step: WorkoutStep,\n messageIndex: number,\n logger: Logger,\n options: ConvertWorkoutStepOptions = {}\n): Record<string, unknown> => {\n const { notesTruncation = \"truncate\" } = options;\n\n logger.debug(\"Converting workout step\", { stepIndex: step.stepIndex });\n\n const workoutStepMesg: Record<string, unknown> = {\n messageIndex,\n };\n\n if (step.name) {\n workoutStepMesg.wktStepName = step.name;\n }\n\n if (step.intensity) {\n workoutStepMesg.intensity = step.intensity;\n }\n\n if (step.notes !== undefined) {\n workoutStepMesg.notes = convertNotes(\n step.notes,\n step.stepIndex,\n notesTruncation,\n logger\n );\n }\n\n if (step.equipment !== undefined) {\n workoutStepMesg.equipment = mapEquipmentToFit(step.equipment);\n }\n\n convertDuration(step, workoutStepMesg);\n convertTarget(step, workoutStepMesg);\n\n return workoutStepMesg;\n};\n\nconst convertNotes = (\n notes: string,\n stepIndex: number,\n behavior: TruncationBehavior,\n logger: Logger\n): string => {\n if (notes.length <= FIT_NOTES_MAX_LENGTH) {\n return notes;\n }\n\n if (behavior === \"error\") {\n throw createFitParsingError(\n `Notes exceed ${FIT_NOTES_MAX_LENGTH} characters at step ${stepIndex} ` +\n `(length: ${notes.length}). Use notesTruncation: \"truncate\" to auto-truncate.`\n );\n }\n\n logger.warn(\n `Notes truncated from ${notes.length} to ${FIT_NOTES_MAX_LENGTH} characters`,\n { stepIndex, originalLength: notes.length }\n );\n return notes.substring(0, FIT_NOTES_MAX_LENGTH);\n};\n","import type { RepetitionBlock, Workout } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\nimport { isRepetitionBlock } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../schemas/fit-duration\";\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\nimport { FIT_MESSAGE_NUMBERS } from \"../shared/message-numbers\";\nimport {\n convertWorkoutStep,\n type ConvertWorkoutStepOptions,\n} from \"./krd-to-fit-step.mapper\";\n\nexport type ConvertWorkoutStepsOptions = ConvertWorkoutStepOptions;\n\nexport const convertWorkoutSteps = (\n workout: Workout,\n logger: Logger,\n options: ConvertWorkoutStepsOptions = {}\n): Array<unknown> => {\n logger.debug(\"Converting workout steps\", { stepCount: workout.steps.length });\n\n const messages: Array<unknown> = [];\n let messageIndex = 0;\n\n for (const step of workout.steps) {\n if (isRepetitionBlock(step)) {\n const repetitionMessages = convertRepetitionBlock(\n step,\n messageIndex,\n logger,\n options\n );\n messages.push(...repetitionMessages);\n messageIndex += repetitionMessages.length;\n } else {\n const stepMessage = convertWorkoutStep(\n step,\n messageIndex,\n logger,\n options\n );\n messages.push(stepMessage);\n messageIndex += 1;\n }\n }\n\n return messages;\n};\n\nconst convertRepetitionBlock = (\n block: RepetitionBlock,\n startIndex: number,\n logger: Logger,\n options: ConvertWorkoutStepsOptions\n): Array<unknown> => {\n logger.debug(\"Converting repetition block\", {\n repeatCount: block.repeatCount,\n stepCount: block.steps.length,\n });\n\n const messages: Array<unknown> = [];\n let messageIndex = startIndex;\n\n for (const step of block.steps) {\n const stepMessage = convertWorkoutStep(step, messageIndex, logger, options);\n messages.push(stepMessage);\n messageIndex += 1;\n }\n\n const repeatMessage: Record<string, unknown> = {\n mesgNum: FIT_MESSAGE_NUMBERS.WORKOUT_STEP,\n messageIndex,\n durationType: fitDurationTypeSchema.enum.repeatUntilStepsCmplt,\n durationStep: startIndex,\n repeatSteps: block.repeatCount,\n targetType: fitTargetTypeSchema.enum.open,\n };\n messages.push(repeatMessage);\n\n return messages;\n};\n","import type { Logger } from \"@kaiord/core\";\nimport type { KRD } from \"@kaiord/core\";\nimport { type Workout, workoutSchema } from \"@kaiord/core\";\nimport { createFitParsingError } from \"@kaiord/core\";\n\nimport { FIT_MESSAGE_NUMBERS } from \"../shared/message-numbers\";\nimport {\n convertMetadataToFileId,\n convertWorkoutMetadata,\n} from \"./krd-to-fit-metadata.mapper\";\nimport { convertWorkoutSteps } from \"./krd-to-fit-workout.mapper\";\n\n/**\n * Safely converts unknown to Record<string, unknown>.\n * Returns empty object if value is not a valid object.\n */\nconst toRecord = (value: unknown): Record<string, unknown> => {\n if (typeof value === \"object\" && value !== null) {\n return value as Record<string, unknown>;\n }\n return {};\n};\n\n/**\n * Extracts and validates workout data from KRD extensions.\n * Throws if workout is missing or invalid.\n */\nconst extractWorkout = (krd: KRD, logger: Logger): Workout => {\n const rawWorkout = krd.extensions?.structured_workout;\n if (!rawWorkout) {\n throw createFitParsingError(\"KRD missing workout data in extensions\");\n }\n\n const result = workoutSchema.safeParse(rawWorkout);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n logger.error(\"Invalid workout data in KRD extensions\", { issues });\n throw createFitParsingError(`Invalid workout data: ${issues}`);\n }\n\n return result.data;\n};\n\nexport const convertKRDToMessages = (\n krd: KRD,\n logger: Logger\n): Array<unknown> => {\n logger.debug(\"Converting KRD to FIT messages\");\n\n const messages: Array<unknown> = [];\n\n const fileIdMessage = convertMetadataToFileId(krd, logger);\n messages.push({\n mesgNum: FIT_MESSAGE_NUMBERS.FILE_ID,\n ...fileIdMessage,\n });\n\n const workout = extractWorkout(krd, logger);\n\n const workoutMessage = convertWorkoutMetadata(workout, logger);\n messages.push({\n mesgNum: FIT_MESSAGE_NUMBERS.WORKOUT,\n ...workoutMessage,\n });\n\n const workoutStepMessages = convertWorkoutSteps(workout, logger);\n for (const stepMessage of workoutStepMessages) {\n messages.push({\n mesgNum: FIT_MESSAGE_NUMBERS.WORKOUT_STEP,\n ...toRecord(stepMessage),\n });\n }\n\n logger.debug(\"Converted KRD to FIT messages\", {\n messageCount: messages.length,\n });\n\n return messages;\n};\n","/**\n * Coordinate conversion utilities for FIT ↔ KRD.\n *\n * FIT uses semicircles for coordinates (signed 32-bit integer).\n * KRD uses degrees (-90 to 90 for lat, -180 to 180 for lon).\n */\n\nconst SEMICIRCLES_TO_DEGREES = 180 / Math.pow(2, 31);\nconst DEGREES_TO_SEMICIRCLES = Math.pow(2, 31) / 180;\n\n/**\n * Converts FIT semicircles to degrees.\n * @param semicircles - Coordinate in semicircles (signed 32-bit integer)\n * @returns Coordinate in degrees\n */\nexport const semicirclesToDegrees = (semicircles: number): number =>\n semicircles * SEMICIRCLES_TO_DEGREES;\n\n/**\n * Converts degrees to FIT semicircles.\n * @param degrees - Coordinate in degrees\n * @returns Coordinate in semicircles (rounded to integer)\n */\nexport const degreesToSemicircles = (degrees: number): number =>\n Math.round(degrees * DEGREES_TO_SEMICIRCLES);\n\n/**\n * Validates that coordinates are within valid ranges.\n * Handles edge cases: NaN, Infinity.\n *\n * @param latSemicircles - Latitude in semicircles\n * @param lonSemicircles - Longitude in semicircles\n * @returns true if coordinates are valid\n */\nexport const validateCoordinates = (\n latSemicircles: number,\n lonSemicircles: number\n): boolean => {\n if (!Number.isFinite(latSemicircles) || !Number.isFinite(lonSemicircles)) {\n return false;\n }\n\n const degreesLat = semicirclesToDegrees(latSemicircles);\n const degreesLon = semicirclesToDegrees(lonSemicircles);\n\n return (\n degreesLat >= -90 &&\n degreesLat <= 90 &&\n degreesLon >= -180 &&\n degreesLon <= 180\n );\n};\n","import { z } from \"zod\";\n\nexport const fitMessageKeySchema = z.enum([\n \"fileIdMesgs\",\n \"workoutMesgs\",\n \"workoutStepMesgs\",\n \"sessionMesgs\",\n \"recordMesgs\",\n \"eventMesgs\",\n \"lapMesgs\",\n]);\n\nexport type FitMessageKey = z.infer<typeof fitMessageKeySchema>;\n","import type { KRDEvent } from \"@kaiord/core\";\n\nimport type { FitEvent, FitEventType } from \"../schemas/fit-event\";\n\nexport const FIT_EVENT_TO_KRD_TYPE: Record<FitEvent, KRDEvent[\"eventType\"]> = {\n timer: \"event_timer\",\n workout: \"event_start\",\n workoutStep: \"event_workout_step_change\",\n powerDown: \"event_stop\",\n powerUp: \"event_start\",\n offCourse: \"event_marker\",\n session: \"event_session_start\",\n lap: \"event_lap\",\n coursePoint: \"event_marker\",\n battery: \"event_marker\",\n virtualPartnerPace: \"event_marker\",\n hrHighAlert: \"event_marker\",\n hrLowAlert: \"event_marker\",\n speedHighAlert: \"event_marker\",\n speedLowAlert: \"event_marker\",\n cadHighAlert: \"event_marker\",\n cadLowAlert: \"event_marker\",\n powerHighAlert: \"event_marker\",\n powerLowAlert: \"event_marker\",\n recoveryHr: \"event_marker\",\n batteryLow: \"event_marker\",\n timeDurationAlert: \"event_marker\",\n distanceDurationAlert: \"event_marker\",\n calorieDurationAlert: \"event_marker\",\n activity: \"event_activity_start\",\n fitnessEquipment: \"event_marker\",\n length: \"event_lap\",\n userMarker: \"event_marker\",\n sportPoint: \"event_marker\",\n calibration: \"event_marker\",\n frontGearChange: \"event_marker\",\n rearGearChange: \"event_marker\",\n riderPositionChange: \"event_marker\",\n elevHighAlert: \"event_marker\",\n elevLowAlert: \"event_marker\",\n};\n\nexport const KRD_TYPE_TO_FIT_EVENT: Record<KRDEvent[\"eventType\"], FitEvent> = {\n event_start: \"timer\",\n event_stop: \"timer\",\n event_pause: \"timer\",\n event_resume: \"timer\",\n event_lap: \"lap\",\n event_marker: \"userMarker\",\n event_timer: \"timer\",\n event_workout_step_change: \"workoutStep\",\n event_session_start: \"session\",\n event_activity_start: \"activity\",\n};\n\nexport const KRD_TYPE_TO_FIT_EVENT_TYPE: Record<\n KRDEvent[\"eventType\"],\n FitEventType\n> = {\n event_start: \"start\",\n event_stop: \"stop\",\n event_pause: \"stopDisable\",\n event_resume: \"start\",\n event_lap: \"marker\",\n event_marker: \"marker\",\n event_timer: \"start\",\n event_workout_step_change: \"marker\",\n event_session_start: \"start\",\n event_activity_start: \"start\",\n};\n","import type { KRDEvent } from \"@kaiord/core\";\n\nimport type {\n FitEvent,\n FitEventMessage,\n FitEventType,\n} from \"../schemas/fit-event\";\nimport {\n FIT_EVENT_TO_KRD_TYPE,\n KRD_TYPE_TO_FIT_EVENT,\n KRD_TYPE_TO_FIT_EVENT_TYPE,\n} from \"./event-type-maps\";\n\nconst mapEventTypeToKrd = (\n fitEvent: FitEvent,\n fitEventType: FitEventType\n): KRDEvent[\"eventType\"] => {\n if (fitEvent === \"timer\") {\n switch (fitEventType) {\n case \"start\":\n return \"event_start\";\n case \"stop\":\n return \"event_stop\";\n case \"stopDisable\":\n case \"stopDisableAll\":\n return \"event_pause\";\n default:\n return \"event_timer\";\n }\n }\n return FIT_EVENT_TO_KRD_TYPE[fitEvent] ?? \"event_marker\";\n};\n\n/** Maps FIT EVENT to KRD event. */\nexport const mapFitEventToKrd = (fit: FitEventMessage): KRDEvent => ({\n timestamp: new Date(fit.timestamp * 1000).toISOString(),\n eventType: mapEventTypeToKrd(fit.event, fit.eventType),\n eventGroup: fit.eventGroup,\n data: fit.data,\n});\n\n/** Maps KRD event to FIT EVENT. */\nexport const mapKrdEventToFit = (krd: KRDEvent): Partial<FitEventMessage> => ({\n timestamp: Math.floor(new Date(krd.timestamp).getTime() / 1000),\n event: KRD_TYPE_TO_FIT_EVENT[krd.eventType] ?? \"userMarker\",\n eventType: KRD_TYPE_TO_FIT_EVENT_TYPE[krd.eventType] ?? \"marker\",\n eventGroup: krd.eventGroup,\n data: krd.data,\n});\n","import { z } from \"zod\";\n\n/**\n * FIT event types (what kind of event occurred).\n */\nexport const fitEventSchema = z.enum([\n \"timer\",\n \"workout\",\n \"workoutStep\",\n \"powerDown\",\n \"powerUp\",\n \"offCourse\",\n \"session\",\n \"lap\",\n \"coursePoint\",\n \"battery\",\n \"virtualPartnerPace\",\n \"hrHighAlert\",\n \"hrLowAlert\",\n \"speedHighAlert\",\n \"speedLowAlert\",\n \"cadHighAlert\",\n \"cadLowAlert\",\n \"powerHighAlert\",\n \"powerLowAlert\",\n \"recoveryHr\",\n \"batteryLow\",\n \"timeDurationAlert\",\n \"distanceDurationAlert\",\n \"calorieDurationAlert\",\n \"activity\",\n \"fitnessEquipment\",\n \"length\",\n \"userMarker\",\n \"sportPoint\",\n \"calibration\",\n \"frontGearChange\",\n \"rearGearChange\",\n \"riderPositionChange\",\n \"elevHighAlert\",\n \"elevLowAlert\",\n]);\n\nexport type FitEvent = z.infer<typeof fitEventSchema>;\n\n/**\n * FIT event type (start, stop, marker, etc.).\n */\nexport const fitEventTypeSchema = z.enum([\n \"start\",\n \"stop\",\n \"consecutiveDepreciated\",\n \"marker\",\n \"stopAll\",\n \"beginDepreciated\",\n \"endDepreciated\",\n \"endAllDepreciated\",\n \"stopDisable\",\n \"stopDisableAll\",\n]);\n\nexport type FitEventType = z.infer<typeof fitEventTypeSchema>;\n\n/**\n * FIT EVENT message schema (Message ID: 21).\n *\n * Captures workout events like start, stop, pause, markers.\n */\nexport const fitEventMessageSchema = z.object({\n timestamp: z.number(),\n event: fitEventSchema,\n eventType: fitEventTypeSchema,\n eventGroup: z.number().optional(),\n data: z.number().optional(),\n data16: z.number().optional(),\n});\n\nexport type FitEventMessage = z.infer<typeof fitEventMessageSchema>;\n","import type { KRDEvent } from \"@kaiord/core\";\n\nimport {\n type FitEventMessage,\n fitEventMessageSchema,\n} from \"../schemas/fit-event\";\nimport { mapFitEventToKrd } from \"./event.mapper\";\n\n/**\n * Converts a FIT EVENT message to KRD event format.\n *\n * @param data - Raw FIT EVENT message data\n * @returns KRD event object\n * @throws Error if FIT data is invalid\n */\nexport const convertFitToKrdEvent = (\n data: Record<string, unknown>\n): KRDEvent => {\n const fitEvent = fitEventMessageSchema.parse(data) as FitEventMessage;\n return mapFitEventToKrd(fitEvent);\n};\n\n/**\n * Batch converts FIT EVENT messages to KRD events.\n *\n * @param events - Array of raw FIT EVENT message data\n * @returns Array of KRD event objects\n */\nexport const convertFitToKrdEvents = (\n events: Record<string, unknown>[]\n): KRDEvent[] => {\n return events.map(convertFitToKrdEvent);\n};\n","const extractDeveloperFields = (\n message: Record<string, unknown>\n): Array<Record<string, unknown>> => {\n const devFields: Array<Record<string, unknown>> = [];\n\n for (const [key, value] of Object.entries(message)) {\n if (key.startsWith(\"developer_\") || key.includes(\"DeveloperField\")) {\n devFields.push({\n fieldName: key,\n value,\n });\n }\n }\n\n return devFields;\n};\n\nexport const extractFieldsFromMessageArray = (\n messages: unknown[]\n): Array<Record<string, unknown>> => {\n const developerFields: Array<Record<string, unknown>> = [];\n for (const message of messages) {\n if (message && typeof message === \"object\") {\n const devFields = extractDeveloperFields(\n message as Record<string, unknown>\n );\n if (devFields.length > 0) {\n developerFields.push(...devFields);\n }\n }\n }\n return developerFields;\n};\n","import type { Logger } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../shared/types\";\nimport { extractFieldsFromMessageArray } from \"./developer-fields.extractor\";\n\nexport const extractFitExtensions = (\n messages: FitMessages,\n logger: Logger\n): Record<string, unknown> => {\n logger.debug(\"Extracting FIT extensions\");\n\n const unknownMessages = extractUnknownMessages(messages, logger);\n const developerFields = extractAllDeveloperFields(messages);\n\n return buildExtensions(unknownMessages, developerFields, logger);\n};\n\nconst extractUnknownMessages = (\n messages: FitMessages,\n logger: Logger\n): Record<string, Array<Record<string, unknown>>> => {\n const knownMessageKeys = new Set<string>([\n fitMessageKeySchema.enum.fileIdMesgs,\n fitMessageKeySchema.enum.workoutMesgs,\n fitMessageKeySchema.enum.workoutStepMesgs,\n ]);\n\n const unknownMessages: Record<string, Array<Record<string, unknown>>> = {};\n\n for (const [key, value] of Object.entries(messages)) {\n if (!knownMessageKeys.has(key) && value && Array.isArray(value)) {\n logger.debug(\"Found unknown message type\", { messageType: key });\n unknownMessages[key] = value;\n }\n }\n\n return unknownMessages;\n};\n\nconst extractAllDeveloperFields = (\n messages: FitMessages\n): Array<Record<string, unknown>> => {\n const developerFields: Array<Record<string, unknown>> = [];\n\n for (const value of Object.values(messages)) {\n if (value && Array.isArray(value)) {\n developerFields.push(...extractFieldsFromMessageArray(value));\n }\n }\n\n return developerFields;\n};\n\nconst buildExtensions = (\n unknownMessages: Record<string, Array<Record<string, unknown>>>,\n developerFields: Array<Record<string, unknown>>,\n logger: Logger\n): Record<string, unknown> => {\n const extensions: Record<string, unknown> = {};\n\n if (developerFields.length > 0) {\n logger.info(\"Preserved developer fields\", {\n count: developerFields.length,\n });\n extensions.developerFields = developerFields;\n }\n\n if (Object.keys(unknownMessages).length > 0) {\n logger.info(\"Preserved unknown message types\", {\n types: Object.keys(unknownMessages),\n });\n extensions.unknownMessages = unknownMessages;\n }\n\n return extensions;\n};\n","import { z } from \"zod\";\n\n/**\n * FIT lap trigger types (what caused the lap to be recorded).\n */\nexport const fitLapTriggerSchema = z.enum([\n \"manual\",\n \"time\",\n \"distance\",\n \"positionStart\",\n \"positionLap\",\n \"positionWaypoint\",\n \"positionMarked\",\n \"sessionEnd\",\n \"fitnessEquipment\",\n]);\n\nexport type FitLapTrigger = z.infer<typeof fitLapTriggerSchema>;\n","import { z } from \"zod\";\n\nexport const fitSportSchema = z.enum([\n \"cycling\",\n \"running\",\n \"swimming\",\n \"generic\",\n]);\n\nexport type FitSport = z.infer<typeof fitSportSchema>;\n","import { z } from \"zod\";\n\nimport { fitLapTriggerSchema } from \"./fit-lap-trigger\";\nimport { fitSportSchema } from \"./fit-sport\";\nimport { fitSubSportSchema } from \"./fit-sub-sport\";\n\n/**\n * FIT LAP message schema (Message ID: 19).\n *\n * Contains per-lap/interval statistics for structured workouts.\n */\nexport const fitLapSchema = z.object({\n // Identifiers\n messageIndex: z.number().optional(),\n timestamp: z.number(),\n\n // Timing\n startTime: z.number(),\n totalElapsedTime: z.number(),\n totalTimerTime: z.number(),\n\n // Distance\n totalDistance: z.number().optional(),\n\n // Speed (enhanced values preferred when available)\n avgSpeed: z.number().optional(),\n maxSpeed: z.number().optional(),\n enhancedAvgSpeed: z.number().optional(),\n enhancedMaxSpeed: z.number().optional(),\n\n // Heart rate\n avgHeartRate: z.number().optional(),\n maxHeartRate: z.number().optional(),\n\n // Cadence\n avgCadence: z.number().optional(),\n maxCadence: z.number().optional(),\n\n // Power\n avgPower: z.number().optional(),\n maxPower: z.number().optional(),\n normalizedPower: z.number().optional(),\n\n // Elevation\n totalAscent: z.number().optional(),\n totalDescent: z.number().optional(),\n\n // Calories\n totalCalories: z.number().optional(),\n\n // Classification\n lapTrigger: fitLapTriggerSchema.optional(),\n sport: fitSportSchema.optional(),\n subSport: fitSubSportSchema.optional(),\n\n // Swimming\n numLengths: z.number().optional(),\n swimStroke: z.number().optional(),\n\n // Workout reference\n wktStepIndex: z.number().optional(),\n});\n\nexport type FitLap = z.infer<typeof fitLapSchema>;\n","import type { KRDLapTrigger } from \"@kaiord/core\";\n\nimport type { FitLapTrigger } from \"../schemas/fit-lap-trigger\";\n\n/**\n * Maps FIT lap trigger to KRD lap trigger.\n * Position-based triggers are consolidated into \"position\".\n */\nexport const mapFitLapTriggerToKrd = (fit: FitLapTrigger): KRDLapTrigger => {\n switch (fit) {\n case \"manual\":\n return \"manual\";\n case \"time\":\n return \"time\";\n case \"distance\":\n return \"distance\";\n case \"positionStart\":\n case \"positionLap\":\n case \"positionWaypoint\":\n case \"positionMarked\":\n return \"position\";\n case \"sessionEnd\":\n return \"session_end\";\n case \"fitnessEquipment\":\n return \"fitness_equipment\";\n }\n};\n\n/**\n * Maps KRD lap trigger to FIT lap trigger.\n * Position defaults to positionLap.\n */\nexport const mapKrdLapTriggerToFit = (krd: KRDLapTrigger): FitLapTrigger => {\n switch (krd) {\n case \"manual\":\n return \"manual\";\n case \"time\":\n return \"time\";\n case \"distance\":\n return \"distance\";\n case \"position\":\n return \"positionLap\";\n case \"session_end\":\n return \"sessionEnd\";\n case \"fitness_equipment\":\n return \"fitnessEquipment\";\n }\n};\n","import type { KRDLap } from \"@kaiord/core\";\nimport { FIT_TO_SWIM_STROKE } from \"@kaiord/core\";\n\nimport type { FitLap } from \"../schemas/fit-lap\";\nimport { mapSubSportToKrd } from \"../sub-sport/sub-sport\";\nimport { mapFitLapTriggerToKrd } from \"./lap-trigger.mapper\";\n\n/**\n * Maps FIT LAP fields to KRD lap fields.\n * Thin translation layer - no complex logic.\n */\nexport const mapFitLapToKrd = (fit: FitLap): KRDLap => ({\n // Timing - convert ms to seconds\n startTime: new Date(fit.startTime * 1000).toISOString(),\n totalElapsedTime: fit.totalElapsedTime / 1000,\n totalTimerTime: fit.totalTimerTime / 1000,\n\n // Distance\n totalDistance: fit.totalDistance,\n\n // Heart rate\n avgHeartRate: fit.avgHeartRate,\n maxHeartRate: fit.maxHeartRate,\n\n // Cadence\n avgCadence: fit.avgCadence,\n maxCadence: fit.maxCadence,\n\n // Power\n avgPower: fit.avgPower,\n maxPower: fit.maxPower,\n normalizedPower: fit.normalizedPower,\n\n // Speed - prefer enhanced values\n avgSpeed: fit.enhancedAvgSpeed ?? fit.avgSpeed,\n maxSpeed: fit.enhancedMaxSpeed ?? fit.maxSpeed,\n\n // Elevation\n totalAscent: fit.totalAscent,\n totalDescent: fit.totalDescent,\n\n // Calories\n totalCalories: fit.totalCalories,\n\n // Classification\n trigger: fit.lapTrigger ? mapFitLapTriggerToKrd(fit.lapTrigger) : undefined,\n sport: fit.sport,\n subSport: fit.subSport ? mapSubSportToKrd(fit.subSport) : undefined,\n\n // Workout reference\n workoutStepIndex: fit.wktStepIndex,\n\n // Swimming\n numLengths: fit.numLengths,\n swimStroke:\n fit.swimStroke !== undefined\n ? FIT_TO_SWIM_STROKE[fit.swimStroke]\n : undefined,\n});\n","import type { KRDLap } from \"@kaiord/core\";\n\nimport type { FitLap } from \"../schemas/fit-lap\";\nimport { fitLapSchema } from \"../schemas/fit-lap\";\nimport { mapFitLapToKrd } from \"./fit-to-krd-lap.mapper\";\n\n/**\n * Converts a FIT LAP message to KRD lap format.\n *\n * @param data - Raw FIT LAP message data\n * @returns KRD lap object\n * @throws Error if FIT data is invalid\n */\nexport const convertFitToKrdLap = (data: Record<string, unknown>): KRDLap => {\n const fitLap = fitLapSchema.parse(data) as FitLap;\n return mapFitLapToKrd(fitLap);\n};\n\n/**\n * Batch converts FIT LAP messages to KRD laps.\n *\n * @param laps - Array of raw FIT LAP message data\n * @returns Array of KRD lap objects\n */\nexport const convertFitToKrdLaps = (\n laps: Record<string, unknown>[]\n): KRDLap[] => {\n return laps.map(convertFitToKrdLap);\n};\n","import { z } from \"zod\";\n\n/**\n * FIT RECORD message schema (Message ID: 20).\n *\n * Contains time-series data points (typically 1 per second).\n * Coordinates are in semicircles (signed 32-bit integer).\n */\nexport const fitRecordSchema = z.object({\n timestamp: z.number(),\n positionLat: z.number().optional(),\n positionLong: z.number().optional(),\n altitude: z.number().optional(),\n enhancedAltitude: z.number().optional(),\n speed: z.number().optional(),\n enhancedSpeed: z.number().optional(),\n distance: z.number().optional(),\n heartRate: z.number().optional(),\n cadence: z.number().optional(),\n fractionalCadence: z.number().optional(),\n power: z.number().optional(),\n temperature: z.number().optional(),\n verticalOscillation: z.number().optional(),\n stanceTime: z.number().optional(),\n stanceTimePercent: z.number().optional(),\n stepLength: z.number().optional(),\n compressedTimestamp: z.number().optional(),\n});\n\nexport type FitRecord = z.infer<typeof fitRecordSchema>;\n","import type { KRDRecord } from \"@kaiord/core\";\n\nimport type { FitRecord } from \"../schemas/fit-record\";\nimport { semicirclesToDegrees } from \"../shared/coordinate.converter\";\n\nconst mapFitPosition = (\n fit: FitRecord\n): { lat: number; lon: number } | undefined => {\n if (fit.positionLat !== undefined && fit.positionLong !== undefined) {\n return {\n lat: semicirclesToDegrees(fit.positionLat),\n lon: semicirclesToDegrees(fit.positionLong),\n };\n }\n return undefined;\n};\n\nconst mapFitAltitudeAndSpeed = (fit: FitRecord, record: KRDRecord): void => {\n if (fit.enhancedAltitude !== undefined) {\n record.altitude = fit.enhancedAltitude;\n } else if (fit.altitude !== undefined) {\n record.altitude = fit.altitude;\n }\n if (fit.enhancedSpeed !== undefined) {\n record.speed = fit.enhancedSpeed;\n } else if (fit.speed !== undefined) {\n record.speed = fit.speed;\n }\n};\n\nconst mapFitCoreFields = (fit: FitRecord, record: KRDRecord): void => {\n if (fit.distance !== undefined) record.distance = fit.distance;\n if (fit.heartRate !== undefined) record.heartRate = fit.heartRate;\n if (fit.power !== undefined) record.power = fit.power;\n if (fit.temperature !== undefined) record.temperature = fit.temperature;\n if (fit.cadence !== undefined) {\n record.cadence = fit.cadence + (fit.fractionalCadence ?? 0);\n }\n};\n\nconst mapFitRunningDynamics = (fit: FitRecord, record: KRDRecord): void => {\n if (fit.verticalOscillation !== undefined) {\n record.verticalOscillation = fit.verticalOscillation;\n }\n if (fit.stanceTime !== undefined) record.stanceTime = fit.stanceTime;\n if (fit.stepLength !== undefined) record.stepLength = fit.stepLength;\n};\n\n/**\n * Maps FIT RECORD fields to KRD record fields.\n * Thin translation layer - no complex logic.\n */\nexport const mapFitRecordToKrd = (fit: FitRecord): KRDRecord => {\n const record: KRDRecord = {\n timestamp: new Date(fit.timestamp * 1000).toISOString(),\n };\n\n const position = mapFitPosition(fit);\n if (position) record.position = position;\n mapFitAltitudeAndSpeed(fit, record);\n mapFitCoreFields(fit, record);\n mapFitRunningDynamics(fit, record);\n\n return record;\n};\n","import type { KRDRecord } from \"@kaiord/core\";\n\nimport { type FitRecord, fitRecordSchema } from \"../schemas/fit-record\";\nimport { validateCoordinates } from \"../shared/coordinate.converter\";\nimport { mapFitRecordToKrd } from \"./record.mapper\";\n\n/**\n * Converts a FIT RECORD message to KRD record format.\n *\n * @param data - Raw FIT RECORD message data\n * @returns KRD record object\n * @throws Error if FIT data is invalid or coordinates out of range\n */\nexport const convertFitToKrdRecord = (\n data: Record<string, unknown>\n): KRDRecord => {\n const fitRecord = fitRecordSchema.parse(data) as FitRecord;\n\n // Validate coordinates if present - both must be present or neither\n const hasLat = fitRecord.positionLat !== undefined;\n const hasLon = fitRecord.positionLong !== undefined;\n\n if (hasLat !== hasLon) {\n throw new Error(\"Partial coordinates: both lat and lon must be present\");\n }\n\n if (hasLat && hasLon) {\n if (!validateCoordinates(fitRecord.positionLat!, fitRecord.positionLong!)) {\n throw new Error(\"Invalid coordinates: out of range\");\n }\n }\n\n return mapFitRecordToKrd(fitRecord);\n};\n\n/**\n * Batch converts FIT RECORD messages to KRD records.\n * Optimized for processing large numbers of records.\n *\n * @param records - Array of raw FIT RECORD message data\n * @returns Array of KRD record objects\n */\nexport const convertFitToKrdRecords = (\n records: Record<string, unknown>[]\n): KRDRecord[] => {\n return records.map(convertFitToKrdRecord);\n};\n","import { z } from \"zod\";\n\nimport { fitSportSchema } from \"./fit-sport\";\nimport { fitSubSportSchema } from \"./fit-sub-sport\";\n\n/**\n * FIT SESSION message schema (Message ID: 18).\n *\n * Contains aggregate statistics for the entire workout/activity.\n */\nexport const fitSessionSchema = z.object({\n timestamp: z.number(),\n startTime: z.number(),\n totalElapsedTime: z.number(),\n totalTimerTime: z.number(),\n totalDistance: z.number().optional(),\n totalCalories: z.number().optional(),\n avgSpeed: z.number().optional(),\n maxSpeed: z.number().optional(),\n enhancedAvgSpeed: z.number().optional(),\n enhancedMaxSpeed: z.number().optional(),\n avgHeartRate: z.number().optional(),\n maxHeartRate: z.number().optional(),\n avgCadence: z.number().optional(),\n maxCadence: z.number().optional(),\n avgPower: z.number().optional(),\n maxPower: z.number().optional(),\n normalizedPower: z.number().optional(),\n trainingStressScore: z.number().optional(),\n intensityFactor: z.number().optional(),\n totalAscent: z.number().optional(),\n totalDescent: z.number().optional(),\n sport: fitSportSchema,\n subSport: fitSubSportSchema.optional(),\n numLaps: z.number().optional(),\n firstLapIndex: z.number().optional(),\n});\n\nexport type FitSession = z.infer<typeof fitSessionSchema>;\n","import type { KRDSession } from \"@kaiord/core\";\n\nimport type { FitSession } from \"../schemas/fit-session\";\nimport { mapSubSportToFit, mapSubSportToKrd } from \"../sub-sport/sub-sport\";\n\n/**\n * Maps FIT SESSION fields to KRD session fields.\n * Thin translation layer - no complex logic.\n */\nexport const mapFitSessionToKrd = (fit: FitSession): KRDSession => ({\n startTime: new Date(fit.startTime * 1000).toISOString(),\n totalElapsedTime: fit.totalElapsedTime / 1000,\n totalTimerTime:\n fit.totalTimerTime !== undefined ? fit.totalTimerTime / 1000 : undefined,\n totalDistance: fit.totalDistance,\n sport: String(fit.sport),\n subSport: fit.subSport ? mapSubSportToKrd(fit.subSport) : undefined,\n avgHeartRate: fit.avgHeartRate,\n maxHeartRate: fit.maxHeartRate,\n avgCadence: fit.avgCadence,\n maxCadence: fit.maxCadence,\n avgPower: fit.avgPower,\n maxPower: fit.maxPower,\n normalizedPower: fit.normalizedPower,\n trainingStressScore: fit.trainingStressScore,\n intensityFactor: fit.intensityFactor,\n totalCalories: fit.totalCalories,\n totalAscent: fit.totalAscent,\n totalDescent: fit.totalDescent,\n avgSpeed: fit.enhancedAvgSpeed ?? fit.avgSpeed,\n maxSpeed: fit.enhancedMaxSpeed ?? fit.maxSpeed,\n});\n\n/**\n * Maps KRD session fields to FIT SESSION fields.\n * Thin translation layer - no complex logic.\n */\nexport const mapKrdSessionToFit = (krd: KRDSession): Partial<FitSession> => {\n const startTimeSeconds = Math.floor(new Date(krd.startTime).getTime() / 1000);\n const elapsedTimeMs = krd.totalElapsedTime * 1000;\n // Preserve zero totalTimerTime, default to elapsed time if undefined\n const timerTimeMs =\n krd.totalTimerTime !== undefined\n ? krd.totalTimerTime * 1000\n : elapsedTimeMs;\n\n return {\n timestamp: startTimeSeconds + Math.floor(krd.totalElapsedTime),\n startTime: startTimeSeconds,\n totalElapsedTime: elapsedTimeMs,\n totalTimerTime: timerTimeMs,\n totalDistance: krd.totalDistance,\n sport: krd.sport as FitSession[\"sport\"],\n subSport: krd.subSport ? mapSubSportToFit(krd.subSport) : undefined,\n avgHeartRate: krd.avgHeartRate,\n maxHeartRate: krd.maxHeartRate,\n avgCadence: krd.avgCadence,\n maxCadence: krd.maxCadence,\n avgPower: krd.avgPower,\n maxPower: krd.maxPower,\n normalizedPower: krd.normalizedPower,\n trainingStressScore: krd.trainingStressScore,\n intensityFactor: krd.intensityFactor,\n totalCalories: krd.totalCalories,\n totalAscent: krd.totalAscent,\n totalDescent: krd.totalDescent,\n avgSpeed: krd.avgSpeed,\n maxSpeed: krd.maxSpeed,\n };\n};\n","import type { KRDSession } from \"@kaiord/core\";\n\nimport { type FitSession, fitSessionSchema } from \"../schemas/fit-session\";\nimport { mapFitSessionToKrd } from \"./session.mapper\";\n\n/**\n * Converts a FIT SESSION message to KRD session format.\n *\n * @param data - Raw FIT SESSION message data\n * @returns KRD session object\n * @throws Error if FIT data is invalid\n */\nexport const convertFitToKrdSession = (\n data: Record<string, unknown>\n): KRDSession => {\n const fitSession = fitSessionSchema.parse(data) as FitSession;\n return mapFitSessionToKrd(fitSession);\n};\n","import type { Logger } from \"@kaiord/core\";\nimport type { KRD } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { convertFitToKrdEvents } from \"../event\";\nimport { extractFitExtensions } from \"../extensions/extensions.extractor\";\nimport { convertFitToKrdLaps } from \"../lap\";\nimport { convertFitToKrdRecords } from \"../record\";\nimport { fitMessageKeySchema } from \"../schemas/fit-message-keys\";\nimport { convertFitToKrdSession } from \"../session\";\nimport type { FitMessages } from \"../shared/types\";\n\nconst KRD_VERSION = \"1.0\" as const;\n\n/**\n * Converts FIT timeCreated to ISO string, handling Date objects and numbers\n */\nconst convertTimeCreated = (timeCreated: unknown): string => {\n if (timeCreated instanceof Date) return timeCreated.toISOString();\n if (typeof timeCreated === \"number\")\n return new Date(timeCreated * 1000).toISOString();\n return new Date().toISOString();\n};\n\nconst buildKrdMetadata = (\n fileId: Record<string, unknown> | undefined,\n session: ReturnType<typeof convertFitToKrdSession> | undefined\n) => ({\n created: convertTimeCreated(fileId ? fileId.timeCreated : undefined),\n sport: (session ? session.sport : undefined) ?? \"other\",\n subSport: session ? session.subSport : undefined,\n});\n\nconst toOptionalArray = <T>(items: T[]): T[] | undefined =>\n items.length > 0 ? items : undefined;\n\nconst toOptionalSingle = <T>(item: T | undefined): T[] | undefined =>\n item !== undefined ? [item] : undefined;\n\n/**\n * Maps activity file to KRD format.\n */\nexport const mapActivityFileToKRD = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n const fileId = messages[fitMessageKeySchema.enum.fileIdMesgs]?.[0];\n const sessionMsgs = messages[fitMessageKeySchema.enum.sessionMesgs] || [];\n const recordMsgs = messages[fitMessageKeySchema.enum.recordMesgs] || [];\n const eventMsgs = messages[fitMessageKeySchema.enum.eventMesgs] || [];\n const lapMsgs = messages[fitMessageKeySchema.enum.lapMesgs] || [];\n\n logger.debug(\"Mapping activity file\", {\n sessions: sessionMsgs.length,\n records: recordMsgs.length,\n events: eventMsgs.length,\n laps: lapMsgs.length,\n });\n\n const session =\n sessionMsgs.length > 0 ? convertFitToKrdSession(sessionMsgs[0]) : undefined;\n const records = convertFitToKrdRecords(recordMsgs);\n const events = convertFitToKrdEvents(eventMsgs);\n const laps = convertFitToKrdLaps(lapMsgs);\n const fitExtensions = extractFitExtensions(messages, logger);\n\n return {\n version: KRD_VERSION,\n type: fileTypeSchema.enum.recorded_activity,\n metadata: buildKrdMetadata(\n fileId as Record<string, unknown> | undefined,\n session\n ),\n sessions: toOptionalSingle(session),\n laps: toOptionalArray(laps),\n records: toOptionalArray(records),\n events: toOptionalArray(events),\n extensions: { fit: fitExtensions },\n };\n};\n","import type { Sport } from \"@kaiord/core\";\nimport { sportSchema } from \"@kaiord/core\";\n\n/**\n * Default values for FIT file generation and mapping\n */\nexport const DEFAULT_MANUFACTURER = \"development\" as const;\nexport const DEFAULT_SPORT = sportSchema.enum.cycling;\n\n/**\n * Maps FIT sport type to KRD sport type\n * Returns DEFAULT_SPORT if fitSport is undefined\n */\nexport const mapSportType = (fitSport: string | undefined): Sport => {\n if (!fitSport) {\n return DEFAULT_SPORT;\n }\n const lower = fitSport.toLowerCase();\n const result = sportSchema.safeParse(lower);\n return result.success ? result.data : DEFAULT_SPORT;\n};\n","import type { KRDMetadata } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\n\nimport { mapSportType } from \"../shared/type-guards\";\nimport type { FitFileId, FitWorkoutMessage } from \"../shared/types\";\nexport const mapMetadata = (\n fileId: FitFileId | undefined,\n workoutMsg: FitWorkoutMessage | undefined,\n logger: Logger\n): KRDMetadata => {\n logger.debug(\"Mapping metadata from FIT messages\");\n\n const sport = mapSportType(workoutMsg?.sport);\n const created = mapCreatedTimestamp(fileId);\n\n return {\n created,\n manufacturer: fileId?.manufacturer,\n product: fileId?.garminProduct || fileId?.product?.toString(),\n serialNumber: fileId?.serialNumber?.toString(),\n sport,\n };\n};\n\nconst mapCreatedTimestamp = (fileId: FitFileId | undefined): string => {\n if (!fileId?.timeCreated) {\n return new Date().toISOString();\n }\n\n if (typeof fileId.timeCreated === \"string\") {\n return fileId.timeCreated;\n }\n\n if (fileId.timeCreated instanceof Date) {\n return fileId.timeCreated.toISOString();\n }\n\n return new Date().toISOString();\n};\n","import { type LengthUnit, lengthUnitSchema } from \"@kaiord/core\";\n\nconst FIT_LENGTH_UNIT_MAP: Record<number, LengthUnit> = {\n 0: \"meters\",\n 1: \"yards\",\n};\n\nexport const mapLengthUnitToKrd = (fitUnit: number | undefined): LengthUnit => {\n if (fitUnit === undefined) {\n return lengthUnitSchema.enum.meters;\n }\n\n return FIT_LENGTH_UNIT_MAP[fitUnit] || lengthUnitSchema.enum.meters;\n};\n\nexport const mapLengthUnitToFit = (krdUnit: LengthUnit): number => {\n if (krdUnit === lengthUnitSchema.enum.yards) {\n return 1;\n }\n\n return 0;\n};\n","import { type Duration, durationTypeSchema } from \"@kaiord/core\";\n\nimport type { FitDurationData } from \"./duration.converter\";\n\nexport const convertTimeDuration = (data: FitDurationData): Duration | null => {\n if (data.durationTime !== undefined) {\n return {\n type: durationTypeSchema.enum.time,\n seconds: data.durationTime,\n };\n }\n return null;\n};\n\nexport const convertDistanceDuration = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationDistance !== undefined) {\n return {\n type: durationTypeSchema.enum.distance,\n meters: data.durationDistance,\n };\n }\n return null;\n};\n\nexport const convertHeartRateLessThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationHr !== undefined) {\n return {\n type: durationTypeSchema.enum.heart_rate_less_than,\n bpm: data.durationHr,\n };\n }\n return null;\n};\n\nexport const convertHeartRateGreaterThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.repeatHr !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_heart_rate_greater_than,\n bpm: data.repeatHr,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertCaloriesDuration = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationCalories !== undefined) {\n return {\n type: durationTypeSchema.enum.calories,\n calories: data.durationCalories,\n };\n }\n return null;\n};\n\nexport const convertPowerLessThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationPower !== undefined) {\n return {\n type: durationTypeSchema.enum.power_less_than,\n watts: data.durationPower,\n };\n }\n return null;\n};\n\nexport const convertPowerGreaterThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationPower !== undefined) {\n return {\n type: durationTypeSchema.enum.power_greater_than,\n watts: data.durationPower,\n };\n }\n return null;\n};\n","import { type Duration, durationTypeSchema } from \"@kaiord/core\";\n\nimport type { FitDurationData } from \"./duration.converter\";\n\nexport const convertRepeatUntilTime = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationTime !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_time,\n seconds: data.durationTime,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertRepeatUntilDistance = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationDistance !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_distance,\n meters: data.durationDistance,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertRepeatUntilCalories = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationCalories !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_calories,\n calories: data.durationCalories,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertRepeatUntilHrLessThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationHr !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_heart_rate_less_than,\n bpm: data.durationHr,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertRepeatUntilPowerLessThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationPower !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_power_less_than,\n watts: data.durationPower,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertRepeatUntilPowerGreaterThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationPower !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_power_greater_than,\n watts: data.durationPower,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n","import { type Duration, durationTypeSchema } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../schemas/fit-duration\";\nimport {\n convertCaloriesDuration,\n convertDistanceDuration,\n convertHeartRateGreaterThan,\n convertHeartRateLessThan,\n convertPowerGreaterThan,\n convertPowerLessThan,\n convertTimeDuration,\n} from \"./duration-converters\";\nimport {\n convertRepeatUntilCalories,\n convertRepeatUntilDistance,\n convertRepeatUntilHrLessThan,\n convertRepeatUntilPowerGreaterThan,\n convertRepeatUntilPowerLessThan,\n convertRepeatUntilTime,\n} from \"./repeat-duration-converters\";\n\nexport type FitDurationData = {\n durationType?: string;\n durationTime?: number;\n durationDistance?: number;\n durationHr?: number;\n durationStep?: number;\n repeatHr?: number;\n durationCalories?: number;\n durationPower?: number;\n};\n\nconst DURATION_CONVERTERS: Record<\n string,\n (data: FitDurationData) => Duration | null\n> = {\n [fitDurationTypeSchema.enum.time]: convertTimeDuration,\n [fitDurationTypeSchema.enum.distance]: convertDistanceDuration,\n [fitDurationTypeSchema.enum.hrLessThan]: convertHeartRateLessThan,\n [fitDurationTypeSchema.enum.repeatUntilHrGreaterThan]:\n convertHeartRateGreaterThan,\n [fitDurationTypeSchema.enum.calories]: convertCaloriesDuration,\n [fitDurationTypeSchema.enum.powerLessThan]: convertPowerLessThan,\n [fitDurationTypeSchema.enum.powerGreaterThan]: convertPowerGreaterThan,\n [fitDurationTypeSchema.enum.repeatUntilTime]: convertRepeatUntilTime,\n [fitDurationTypeSchema.enum.repeatUntilDistance]: convertRepeatUntilDistance,\n [fitDurationTypeSchema.enum.repeatUntilCalories]: convertRepeatUntilCalories,\n [fitDurationTypeSchema.enum.repeatUntilHrLessThan]:\n convertRepeatUntilHrLessThan,\n [fitDurationTypeSchema.enum.repeatUntilPowerLessThan]:\n convertRepeatUntilPowerLessThan,\n [fitDurationTypeSchema.enum.repeatUntilPowerGreaterThan]:\n convertRepeatUntilPowerGreaterThan,\n};\n\nexport const convertFitDuration = (data: FitDurationData): Duration => {\n const result = fitDurationTypeSchema.safeParse(data.durationType);\n\n if (!result.success) {\n return { type: durationTypeSchema.enum.open };\n }\n\n const converter = DURATION_CONVERTERS[result.data];\n if (converter) {\n return converter(data) || { type: durationTypeSchema.enum.open };\n }\n\n return { type: durationTypeSchema.enum.open };\n};\n","import {\n type Duration,\n type DurationType,\n durationTypeSchema,\n} from \"@kaiord/core\";\n\nimport { convertFitDuration } from \"../duration/duration.converter\";\nimport { fitDurationTypeSchema } from \"../schemas/fit-duration\";\nimport type { FitWorkoutStep } from \"../shared/types\";\n\nexport const mapDuration = (step: FitWorkoutStep): Duration => {\n return convertFitDuration(step);\n};\n\nconst FIT_TO_KRD_DURATION_TYPE: Record<string, DurationType> = {\n [fitDurationTypeSchema.enum.time]: durationTypeSchema.enum.time,\n [fitDurationTypeSchema.enum.distance]: durationTypeSchema.enum.distance,\n [fitDurationTypeSchema.enum.hrLessThan]:\n durationTypeSchema.enum.heart_rate_less_than,\n [fitDurationTypeSchema.enum.repeatUntilHrGreaterThan]:\n durationTypeSchema.enum.repeat_until_heart_rate_greater_than,\n [fitDurationTypeSchema.enum.calories]: durationTypeSchema.enum.calories,\n [fitDurationTypeSchema.enum.powerLessThan]:\n durationTypeSchema.enum.power_less_than,\n [fitDurationTypeSchema.enum.powerGreaterThan]:\n durationTypeSchema.enum.power_greater_than,\n [fitDurationTypeSchema.enum.repeatUntilTime]:\n durationTypeSchema.enum.repeat_until_time,\n [fitDurationTypeSchema.enum.repeatUntilDistance]:\n durationTypeSchema.enum.repeat_until_distance,\n [fitDurationTypeSchema.enum.repeatUntilCalories]:\n durationTypeSchema.enum.repeat_until_calories,\n [fitDurationTypeSchema.enum.repeatUntilHrLessThan]:\n durationTypeSchema.enum.repeat_until_heart_rate_less_than,\n [fitDurationTypeSchema.enum.repeatUntilPowerLessThan]:\n durationTypeSchema.enum.repeat_until_power_less_than,\n [fitDurationTypeSchema.enum.repeatUntilPowerGreaterThan]:\n durationTypeSchema.enum.repeat_until_power_greater_than,\n};\n\nexport const mapDurationType = (\n fitDurationType: string | undefined\n): DurationType => {\n if (!fitDurationType) return durationTypeSchema.enum.open;\n return (\n FIT_TO_KRD_DURATION_TYPE[fitDurationType] ?? durationTypeSchema.enum.open\n );\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport type { FitTargetData } from \"./target.types\";\n\nexport const convertCadenceTarget = (data: FitTargetData): Target => {\n const rangeTarget = buildCadenceRangeTarget(data);\n if (rangeTarget) return rangeTarget;\n\n const zoneTarget = buildCadenceZoneTarget(data);\n if (zoneTarget) return zoneTarget;\n\n const valueTarget = buildCadenceValueTarget(data);\n if (valueTarget) return valueTarget;\n\n return { type: targetTypeSchema.enum.open };\n};\n\nconst buildCadenceRangeTarget = (data: FitTargetData): Target | null => {\n if (\n data.customTargetCadenceLow !== undefined &&\n data.customTargetCadenceHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.cadence,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetCadenceLow,\n max: data.customTargetCadenceHigh,\n },\n };\n }\n\n if (\n data.customTargetValueLow !== undefined &&\n data.customTargetValueHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.cadence,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetValueLow,\n max: data.customTargetValueHigh,\n },\n };\n }\n\n return null;\n};\n\nconst buildCadenceZoneTarget = (data: FitTargetData): Target | null => {\n if (data.targetCadenceZone !== undefined) {\n return {\n type: targetTypeSchema.enum.cadence,\n value: {\n unit: targetUnitSchema.enum.rpm,\n value: data.targetCadenceZone,\n },\n };\n }\n return null;\n};\n\nconst buildCadenceValueTarget = (data: FitTargetData): Target | null => {\n if (data.targetValue !== undefined) {\n return {\n type: targetTypeSchema.enum.cadence,\n value: {\n unit: targetUnitSchema.enum.rpm,\n value: data.targetValue,\n },\n };\n }\n return null;\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport type { FitTargetData } from \"./target.types\";\n\nexport const convertHeartRateTarget = (data: FitTargetData): Target => {\n const rangeTarget = buildHeartRateRangeTarget(data);\n if (rangeTarget) return rangeTarget;\n\n const zoneTarget = buildHeartRateZoneTarget(data);\n if (zoneTarget) return zoneTarget;\n\n if (data.targetValue !== undefined) {\n return convertHeartRateValue(data.targetValue);\n }\n\n return { type: targetTypeSchema.enum.open };\n};\n\nconst buildHeartRateRangeTarget = (data: FitTargetData): Target | null => {\n if (\n data.customTargetHeartRateLow !== undefined &&\n data.customTargetHeartRateHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.heart_rate,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetHeartRateLow,\n max: data.customTargetHeartRateHigh,\n },\n };\n }\n\n if (\n data.customTargetValueLow !== undefined &&\n data.customTargetValueHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.heart_rate,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetValueLow,\n max: data.customTargetValueHigh,\n },\n };\n }\n\n return null;\n};\n\nconst buildHeartRateZoneTarget = (data: FitTargetData): Target | null => {\n if (data.targetHrZone !== undefined) {\n // Validate zone is in valid range (1-5)\n // If not, treat as BPM value instead\n if (data.targetHrZone >= 1 && data.targetHrZone <= 5) {\n return {\n type: targetTypeSchema.enum.heart_rate,\n value: {\n unit: targetUnitSchema.enum.zone,\n value: data.targetHrZone,\n },\n };\n }\n // Invalid zone value, treat as BPM\n return convertHeartRateValue(data.targetHrZone);\n }\n return null;\n};\n\nconst convertHeartRateValue = (value: number): Target => {\n // Garmin FIT encoding:\n // - Values > 100: Absolute bpm (offset by 100)\n // - Values 0-100: Percentage of max HR\n if (value > 100) {\n return {\n type: targetTypeSchema.enum.heart_rate,\n value: {\n unit: targetUnitSchema.enum.bpm,\n value: value - 100,\n },\n };\n }\n\n if (value > 0) {\n return {\n type: targetTypeSchema.enum.heart_rate,\n value: {\n unit: targetUnitSchema.enum.percent_max,\n value,\n },\n };\n }\n\n return { type: targetTypeSchema.enum.open };\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport type { FitTargetData } from \"./target.types\";\n\nexport const convertPaceTarget = (data: FitTargetData): Target => {\n const rangeTarget = buildPaceRangeTarget(data);\n if (rangeTarget) return rangeTarget;\n\n const zoneTarget = buildPaceZoneTarget(data);\n if (zoneTarget) return zoneTarget;\n\n const valueTarget = buildPaceValueTarget(data);\n if (valueTarget) return valueTarget;\n\n return { type: targetTypeSchema.enum.open };\n};\n\nconst buildPaceRangeTarget = (data: FitTargetData): Target | null => {\n if (\n data.customTargetSpeedLow !== undefined &&\n data.customTargetSpeedHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.pace,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetSpeedLow,\n max: data.customTargetSpeedHigh,\n },\n };\n }\n\n if (\n data.customTargetValueLow !== undefined &&\n data.customTargetValueHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.pace,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetValueLow,\n max: data.customTargetValueHigh,\n },\n };\n }\n\n return null;\n};\n\nconst buildPaceZoneTarget = (data: FitTargetData): Target | null => {\n if (data.targetSpeedZone !== undefined) {\n // Validate zone is in valid range (1-5)\n // If not, treat as mps value instead\n if (data.targetSpeedZone >= 1 && data.targetSpeedZone <= 5) {\n return {\n type: targetTypeSchema.enum.pace,\n value: {\n unit: targetUnitSchema.enum.zone,\n value: data.targetSpeedZone,\n },\n };\n }\n if (data.targetSpeedZone > 0) {\n return {\n type: targetTypeSchema.enum.pace,\n value: {\n unit: targetUnitSchema.enum.mps,\n value: data.targetSpeedZone,\n },\n };\n }\n }\n return null;\n};\n\nconst buildPaceValueTarget = (data: FitTargetData): Target | null => {\n if (data.targetValue !== undefined) {\n return {\n type: targetTypeSchema.enum.pace,\n value: {\n unit: targetUnitSchema.enum.mps,\n value: data.targetValue,\n },\n };\n }\n return null;\n};\n","/**\n * Interprets a workoutPower value from FIT SDK\n * - Values 0-999: Percentage of FTP (direct)\n * - Values >= 1000: Absolute watts (value - 1000)\n */\nexport const interpretWorkoutPower = (\n value: number\n): { type: \"watts\" | \"percentage\"; value: number } => {\n if (value >= 1000) {\n return {\n type: \"watts\",\n value: value - 1000,\n };\n }\n return {\n type: \"percentage\",\n value,\n };\n};\n\n/**\n * Convert a single power value to KRD target\n * Garmin FIT encoding:\n * - Values > 1000: Absolute watts (offset by 1000)\n * - Values 0-1000: Percentage of FTP\n */\nexport const convertPowerValue = (value: number) => {\n if (value > 1000) {\n return {\n unit: \"watts\" as const,\n value: value - 1000,\n };\n }\n\n if (value > 0) {\n return {\n unit: \"percent_ftp\" as const,\n value,\n };\n }\n\n return null;\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport { convertPowerValue, interpretWorkoutPower } from \"./power-helpers\";\nimport type { FitTargetData } from \"./target.types\";\n\nexport const convertPowerTarget = (data: FitTargetData): Target => {\n const rangeTarget = buildPowerRangeTarget(data);\n if (rangeTarget) return rangeTarget;\n\n const zoneTarget = buildPowerZoneTarget(data);\n if (zoneTarget) return zoneTarget;\n\n if (data.targetValue !== undefined) {\n const powerValue = convertPowerValue(data.targetValue);\n if (powerValue) {\n return {\n type: targetTypeSchema.enum.power,\n value: powerValue,\n };\n }\n }\n\n return { type: targetTypeSchema.enum.open };\n};\n\nconst buildPowerRangeTarget = (data: FitTargetData): Target | null => {\n if (\n data.customTargetPowerLow !== undefined &&\n data.customTargetPowerHigh !== undefined\n ) {\n const minValue = interpretWorkoutPower(data.customTargetPowerLow);\n const maxValue = interpretWorkoutPower(data.customTargetPowerHigh);\n\n return {\n type: targetTypeSchema.enum.power,\n value: {\n unit: targetUnitSchema.enum.range,\n min: minValue.value,\n max: maxValue.value,\n },\n };\n }\n\n if (\n data.customTargetValueLow !== undefined &&\n data.customTargetValueHigh !== undefined\n ) {\n const minValue = interpretWorkoutPower(data.customTargetValueLow);\n const maxValue = interpretWorkoutPower(data.customTargetValueHigh);\n\n return {\n type: targetTypeSchema.enum.power,\n value: {\n unit: targetUnitSchema.enum.range,\n min: minValue.value,\n max: maxValue.value,\n },\n };\n }\n\n return null;\n};\n\nconst buildPowerZoneTarget = (data: FitTargetData): Target | null => {\n if (data.targetPowerZone !== undefined) {\n // Validate zone is in valid range (1-7)\n // If not, treat as power value instead\n if (data.targetPowerZone >= 1 && data.targetPowerZone <= 7) {\n return {\n type: targetTypeSchema.enum.power,\n value: {\n unit: targetUnitSchema.enum.zone,\n value: data.targetPowerZone,\n },\n };\n }\n const powerValue = convertPowerValue(data.targetPowerZone);\n if (powerValue) {\n return { type: targetTypeSchema.enum.power, value: powerValue };\n }\n }\n return null;\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport type { FitTargetData } from \"./target.types\";\n\nexport const convertStrokeTypeTarget = (data: FitTargetData): Target => {\n if (data.targetSwimStroke !== undefined) {\n return {\n type: targetTypeSchema.enum.stroke_type,\n value: {\n unit: targetUnitSchema.enum.swim_stroke,\n value: data.targetSwimStroke,\n },\n };\n }\n\n return { type: targetTypeSchema.enum.open };\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\nimport type { FitTargetData } from \"./target.types\";\nimport { convertCadenceTarget } from \"./target-cadence.converter\";\nimport { convertHeartRateTarget } from \"./target-heart-rate.converter\";\nimport { convertPaceTarget } from \"./target-pace.converter\";\nimport { convertPowerTarget } from \"./target-power.converter\";\nimport { convertStrokeTypeTarget } from \"./target-stroke.converter\";\n\nexport type { FitTargetData };\n\nexport const convertFitTarget = (data: FitTargetData): Target => {\n if (data.targetType === fitTargetTypeSchema.enum.power) {\n return convertPowerTarget(data);\n }\n\n if (data.targetType === fitTargetTypeSchema.enum.heartRate) {\n return convertHeartRateTarget(data);\n }\n\n if (data.targetType === fitTargetTypeSchema.enum.cadence) {\n return convertCadenceTarget(data);\n }\n\n if (data.targetType === fitTargetTypeSchema.enum.speed) {\n return convertPaceTarget(data);\n }\n\n if (data.targetType === fitTargetTypeSchema.enum.swimStroke) {\n return convertStrokeTypeTarget(data);\n }\n\n return { type: targetTypeSchema.enum.open };\n};\n","import { type Target, type TargetType, targetTypeSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\nimport type { FitWorkoutStep } from \"../shared/types\";\nimport { convertFitTarget } from \"./target.converter\";\n\nexport const mapTarget = (step: FitWorkoutStep): Target => {\n return convertFitTarget(step);\n};\n\nexport const mapTargetType = (\n fitTargetType: string | undefined\n): TargetType => {\n if (fitTargetType === fitTargetTypeSchema.enum.power)\n return targetTypeSchema.enum.power;\n if (fitTargetType === fitTargetTypeSchema.enum.heartRate)\n return targetTypeSchema.enum.heart_rate;\n if (fitTargetType === fitTargetTypeSchema.enum.cadence)\n return targetTypeSchema.enum.cadence;\n if (fitTargetType === fitTargetTypeSchema.enum.speed)\n return targetTypeSchema.enum.pace;\n if (fitTargetType === fitTargetTypeSchema.enum.swimStroke)\n return targetTypeSchema.enum.stroke_type;\n return targetTypeSchema.enum.open;\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { type Intensity, intensitySchema } from \"@kaiord/core\";\n\nimport { mapDuration, mapDurationType } from \"../duration/duration.mapper\";\nimport { mapEquipmentToKrd } from \"../equipment/equipment.mapper\";\nimport type { FitWorkoutStep } from \"../shared/types\";\nimport { mapTarget, mapTargetType } from \"../target/target.mapper\";\n\nexport const mapStep = (step: FitWorkoutStep, index: number): WorkoutStep => {\n const duration = mapDuration(step);\n const target = mapTarget(step);\n\n const workoutStep: WorkoutStep = {\n stepIndex: step.messageIndex ?? index,\n name: step.wktStepName,\n durationType: mapDurationType(step.durationType),\n duration,\n targetType: mapTargetType(step.targetType),\n target,\n intensity: mapIntensity(step.intensity),\n };\n\n if (step.notes !== undefined) {\n workoutStep.notes = step.notes;\n }\n\n if (step.equipment !== undefined) {\n workoutStep.equipment = mapEquipmentToKrd(step.equipment);\n }\n\n return workoutStep;\n};\n\nconst mapIntensity = (intensity: string | undefined): Intensity | undefined => {\n if (!intensity) return undefined;\n\n const normalized = intensity.toLowerCase();\n const validIntensities = intensitySchema.options;\n\n if (validIntensities.includes(normalized as Intensity)) {\n return normalized as Intensity;\n }\n\n return undefined;\n};\n","import type { RepetitionBlock, WorkoutStep } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../schemas/fit-duration\";\nimport type { FitWorkoutStep } from \"../shared/types\";\nimport { mapStep } from \"./step.mapper\";\n\nexport const findRepetitionStepIndices = (\n workoutSteps: Array<FitWorkoutStep>\n): Set<number> => {\n const indices = new Set<number>();\n\n for (let i = 0; i < workoutSteps.length; i++) {\n const step = workoutSteps[i];\n if (\n step.durationType === fitDurationTypeSchema.enum.repeatUntilStepsCmplt\n ) {\n const startIndex = (step.durationStep || 0) as number;\n for (let j = startIndex; j < i; j++) {\n indices.add(j);\n }\n }\n }\n\n return indices;\n};\n\nexport const buildWorkoutSteps = (\n workoutSteps: Array<FitWorkoutStep>,\n repetitionStepIndices: Set<number>\n): Array<WorkoutStep | RepetitionBlock> => {\n const steps = [];\n\n for (let i = 0; i < workoutSteps.length; i++) {\n const step = workoutSteps[i];\n\n if (\n step.durationType === fitDurationTypeSchema.enum.repeatUntilStepsCmplt &&\n step.repeatSteps\n ) {\n const repetitionBlock = buildRepetitionBlock(step, workoutSteps, i);\n steps.push(repetitionBlock);\n } else if (!repetitionStepIndices.has(i)) {\n steps.push(mapStep(step, i));\n }\n }\n\n return steps;\n};\n\nexport const buildRepetitionBlock = (\n step: FitWorkoutStep,\n workoutSteps: Array<FitWorkoutStep>,\n currentIndex: number\n): RepetitionBlock => {\n const repeatCount = step.repeatSteps!;\n const startIndex = (step.durationStep || 0) as number;\n const repeatedSteps = [];\n\n for (let j = startIndex; j < currentIndex; j++) {\n repeatedSteps.push(mapStep(workoutSteps[j], j));\n }\n\n return {\n repeatCount,\n steps: repeatedSteps,\n };\n};\n","import type { Workout } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\nimport { convertLengthToMeters } from \"@kaiord/core\";\n\nimport { mapLengthUnitToKrd } from \"../length-unit/length-unit.mapper\";\nimport { mapSportType } from \"../shared/type-guards\";\nimport type { FitWorkoutMessage, FitWorkoutStep } from \"../shared/types\";\nimport { mapSubSportToKrd } from \"../sub-sport/sub-sport.mapper\";\nimport {\n buildWorkoutSteps,\n findRepetitionStepIndices,\n} from \"./repetition.builder\";\n\nexport const mapWorkout = (\n workoutMsg: FitWorkoutMessage | undefined,\n workoutSteps: Array<FitWorkoutStep>,\n logger: Logger\n): Workout => {\n logger.debug(\"Mapping workout steps\", {\n stepCount: workoutSteps.length,\n });\n\n const repetitionStepIndices = findRepetitionStepIndices(workoutSteps);\n const steps = buildWorkoutSteps(workoutSteps, repetitionStepIndices);\n\n const workout: Workout = {\n name: workoutMsg?.wktName,\n sport: mapSportType(workoutMsg?.sport),\n steps,\n };\n\n if (workoutMsg?.subSport !== undefined) {\n workout.subSport = mapSubSportToKrd(workoutMsg.subSport);\n }\n\n if (workoutMsg?.poolLength !== undefined) {\n const unit = mapLengthUnitToKrd(workoutMsg.poolLengthUnit);\n workout.poolLength = convertLengthToMeters(workoutMsg.poolLength, unit);\n workout.poolLengthUnit = \"meters\";\n }\n\n return workout;\n};\n","import type { Logger } from \"@kaiord/core\";\nimport { createFitParsingError } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../shared/types\";\n\nexport type ValidateMessagesOptions = {\n /** If true, throw on missing critical messages. Default: true */\n strict?: boolean;\n};\n\ntype ValidateMessagesArgs = [\n fileId: unknown,\n workoutMsg: unknown,\n messages: FitMessages,\n logger: Logger,\n options?: ValidateMessagesOptions,\n];\n\nconst checkFileId = (\n fileId: unknown,\n logger: Logger,\n strict: boolean\n): void => {\n if (!fileId) {\n const message = \"Missing required fileId message in FIT file\";\n if (strict) throw createFitParsingError(message);\n logger.warn(message);\n }\n};\n\nconst checkWorkoutMsg = (\n workoutMsg: unknown,\n logger: Logger,\n strict: boolean\n): void => {\n if (!workoutMsg) {\n const message = \"Missing required workout message in FIT file\";\n if (strict) throw createFitParsingError(message);\n logger.warn(message);\n }\n};\n\n/**\n * Validates required FIT messages are present.\n * In strict mode (default), throws on missing fileId or workout messages.\n */\nexport const validateMessages = (\n ...[fileId, workoutMsg, messages, logger, options = {}]: ValidateMessagesArgs\n): void => {\n const { strict = true } = options;\n checkFileId(fileId, logger, strict);\n checkWorkoutMsg(workoutMsg, logger, strict);\n\n const workoutMessages = messages[fitMessageKeySchema.enum.workoutMesgs];\n if (workoutMessages && workoutMessages.length > 1) {\n logger.warn(\"Multiple workout messages found, using first one\", {\n count: workoutMessages.length,\n });\n }\n};\n","import type { Logger } from \"@kaiord/core\";\nimport type { KRD } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { extractFitExtensions } from \"../extensions/extensions.extractor\";\nimport { mapMetadata } from \"../metadata/metadata.mapper\";\nimport { fitMessageKeySchema } from \"../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../shared/types\";\nimport { mapWorkout } from \"../workout/workout.mapper\";\nimport { validateMessages } from \"./messages.validator\";\n\nconst KRD_VERSION = \"1.0\" as const;\n\n/**\n * Maps workout file to KRD format.\n */\nexport const mapWorkoutFileToKRD = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n const fileId = messages[fitMessageKeySchema.enum.fileIdMesgs]?.[0];\n const workoutMsg = messages[fitMessageKeySchema.enum.workoutMesgs]?.[0];\n const workoutSteps =\n messages[fitMessageKeySchema.enum.workoutStepMesgs] || [];\n\n validateMessages(fileId, workoutMsg, messages, logger);\n\n const metadata = mapMetadata(fileId, workoutMsg, logger);\n const workout = mapWorkout(workoutMsg, workoutSteps, logger);\n const fitExtensions = extractFitExtensions(messages, logger);\n\n return {\n version: KRD_VERSION,\n type: fileTypeSchema.enum.structured_workout,\n metadata,\n extensions: { structured_workout: workout, fit: fitExtensions },\n };\n};\n","import type { Logger } from \"@kaiord/core\";\nimport type { KRD } from \"@kaiord/core\";\nimport { type FileType, fileTypeSchema } from \"@kaiord/core\";\n\nimport { createCourseMessages } from \"../course\";\nimport { convertKRDToMessages } from \"../krd-to-fit/krd-to-fit.converter\";\nimport { fitMessageKeySchema } from \"../schemas/fit-message-keys\";\nimport { FIT_MESSAGE_NUMBERS } from \"../shared/message-numbers\";\nimport type { FitMessages } from \"../shared/types\";\nimport { mapActivityFileToKRD } from \"./activity.mapper\";\nimport { createActivityMessages } from \"./activity-messages.creator\";\nimport { mapWorkoutFileToKRD } from \"./workout.mapper\";\n\n/**\n * Detects file type from FIT messages.\n */\nconst detectFileType = (messages: FitMessages): FileType => {\n const workoutMsgs = messages[fitMessageKeySchema.enum.workoutMesgs];\n if (workoutMsgs && workoutMsgs.length > 0)\n return fileTypeSchema.enum.structured_workout;\n\n const sessionMsgs = messages[fitMessageKeySchema.enum.sessionMesgs];\n const recordMsgs = messages[fitMessageKeySchema.enum.recordMesgs];\n if (\n (sessionMsgs && sessionMsgs.length > 0) ||\n (recordMsgs && recordMsgs.length > 0)\n ) {\n return fileTypeSchema.enum.recorded_activity;\n }\n\n return fileTypeSchema.enum.structured_workout;\n};\n\nexport const mapMessagesToKRD = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n logger.debug(\"Mapping FIT messages to KRD\", {\n messageCount: Object.keys(messages).length,\n });\n\n const fileType = detectFileType(messages);\n logger.debug(\"Detected file type\", { fileType });\n\n switch (fileType) {\n case fileTypeSchema.enum.recorded_activity:\n return mapActivityFileToKRD(messages, logger);\n case fileTypeSchema.enum.structured_workout:\n default:\n return mapWorkoutFileToKRD(messages, logger);\n }\n};\n\nconst groupWorkoutMessages = (\n rawMessages: unknown[]\n): Record<string, unknown[]> => {\n const result: Record<string, unknown[]> = {};\n for (const msg of rawMessages) {\n const message = msg as { mesgNum?: number };\n const key =\n message.mesgNum === FIT_MESSAGE_NUMBERS.FILE_ID\n ? fitMessageKeySchema.enum.fileIdMesgs\n : message.mesgNum === FIT_MESSAGE_NUMBERS.WORKOUT\n ? fitMessageKeySchema.enum.workoutMesgs\n : message.mesgNum === FIT_MESSAGE_NUMBERS.WORKOUT_STEP\n ? fitMessageKeySchema.enum.workoutStepMesgs\n : null;\n if (key) {\n result[key] = [...(result[key] || []), message];\n }\n }\n return result;\n};\n\n/**\n * Creates FIT messages from KRD format with file type routing.\n *\n * Routes to the appropriate message creation function based on the\n * file type specified in KRD metadata. Supports workout, activity,\n * and course file types.\n */\nexport const createFitMessages = (\n krd: KRD,\n logger: Logger\n): Record<string, unknown[]> => {\n const fileType = krd.type;\n logger.debug(\"Creating FIT messages from KRD\", { fileType });\n\n switch (fileType) {\n case \"structured_workout\":\n return groupWorkoutMessages(convertKRDToMessages(krd, logger));\n case \"recorded_activity\":\n return createActivityMessages(krd, logger);\n case \"course\":\n return createCourseMessages(krd, logger);\n default:\n throw new Error(`Unsupported FIT file type: ${fileType}`);\n }\n};\n","/**\n * Garmin FIT SDK Adapter - converts FIT workout files to KRD format\n * References: https://developer.garmin.com/fit/file-types/workout/\n */\n\nimport { Decoder, Encoder, Stream } from \"@garmin/fitsdk\";\nimport type { KRD } from \"@kaiord/core\";\nimport type { BinaryReader } from \"@kaiord/core\";\nimport type { BinaryWriter } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\nimport { createFitParsingError } from \"@kaiord/core\";\n\nimport { convertKRDToMessages } from \"./krd-to-fit/krd-to-fit.converter\";\nimport { mapMessagesToKRD } from \"./messages/messages.mapper\";\nimport type { FitMessages } from \"./shared/types\";\n\nexport const createGarminFitSdkReader =\n (logger: Logger): BinaryReader =>\n async (buffer: Uint8Array): Promise<KRD> => {\n try {\n logger.debug(\"Parsing FIT file\", { bufferSize: buffer.length });\n\n if (buffer.length === 0) {\n logger.error(\"Empty FIT buffer\");\n throw createFitParsingError(\"Cannot parse empty FIT buffer\");\n }\n\n const stream = Stream.fromByteArray(Array.from(buffer));\n const decoder = new Decoder(stream);\n const { messages, errors } = decoder.read();\n\n if (errors.length > 0) {\n logger.error(\"FIT parsing errors detected\", { errors });\n throw createFitParsingError(`FIT parsing errors: ${errors.join(\", \")}`);\n }\n\n logger.info(\"FIT file parsed successfully\");\n return mapMessagesToKRD(messages as FitMessages, logger);\n } catch (error) {\n if (error instanceof Error && error.name === \"FitParsingError\") {\n throw error;\n }\n logger.error(\"Failed to parse FIT file\", { error });\n throw createFitParsingError(\"Failed to parse FIT file\", error);\n }\n };\n\nexport const createGarminFitSdkWriter =\n (logger: Logger): BinaryWriter =>\n async (krd: KRD): Promise<Uint8Array> => {\n try {\n logger.debug(\"Encoding KRD to FIT\");\n\n const encoder = new Encoder();\n const messages = convertKRDToMessages(krd, logger);\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n try {\n logger.debug(`Writing message ${i + 1}/${messages.length}`, {\n mesgNum: (message as { mesgNum?: number }).mesgNum,\n });\n encoder.writeMesg(message);\n } catch (error) {\n logger.error(`Failed to write message ${i + 1}`, {\n message: JSON.stringify(message, null, 2),\n error,\n });\n throw error;\n }\n }\n\n const buffer = encoder.close();\n logger.info(\"KRD encoded to FIT successfully\");\n return new Uint8Array(buffer);\n } catch (error) {\n if (error instanceof Error && error.name === \"FitParsingError\") {\n throw error;\n }\n logger.error(\"Failed to write FIT file\", { error });\n throw createFitParsingError(\"Failed to write FIT file\", error);\n }\n };\n","/**\n * @kaiord/fit - FIT format adapter for Kaiord\n */\n\nimport type { BinaryReader, BinaryWriter, Logger } from \"@kaiord/core\";\nimport { createConsoleLogger } from \"@kaiord/core\";\n\nimport {\n createGarminFitSdkReader,\n createGarminFitSdkWriter,\n} from \"./adapters/garmin-fitsdk\";\n\nexport const createFitReader = (logger?: Logger): BinaryReader =>\n createGarminFitSdkReader(logger || createConsoleLogger());\n\nexport const createFitWriter = (logger?: Logger): BinaryWriter =>\n createGarminFitSdkWriter(logger || createConsoleLogger());\n\nexport const fitReader: BinaryReader = createFitReader();\nexport const fitWriter: BinaryWriter = createFitWriter();\n\nexport { createGarminFitSdkReader, createGarminFitSdkWriter };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/shared/message-numbers.ts","../src/adapters/schemas/fit-file-type.ts","../src/adapters/schemas/fit-sub-sport.ts","../src/adapters/sub-sport/sub-sport.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-manufacturer.converter.ts","../src/adapters/krd-to-fit/krd-to-fit-step-count.helpers.ts","../src/adapters/krd-to-fit/krd-to-fit-metadata.converter.ts","../src/adapters/schemas/fit-duration.ts","../src/adapters/schemas/fit-target.ts","../src/adapters/schemas/fit-equipment.ts","../src/adapters/equipment/equipment.mapper.ts","../src/adapters/krd-to-fit/duration-converters/conditional.ts","../src/adapters/krd-to-fit/duration-converters/repeat.ts","../src/adapters/krd-to-fit/duration-converters/repeat-hr-power.ts","../src/adapters/krd-to-fit/duration-converters/simple.ts","../src/adapters/krd-to-fit/krd-to-fit-duration.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-target-cadence.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-target-heart-rate.converter.ts","../src/adapters/krd-to-fit/krd-to-fit-target-pace.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-target-power.converter.ts","../src/adapters/krd-to-fit/krd-to-fit-target-stroke.converter.ts","../src/adapters/krd-to-fit/krd-to-fit-target.converter.ts","../src/adapters/krd-to-fit/krd-to-fit-step.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit-workout.mapper.ts","../src/adapters/krd-to-fit/krd-to-fit.converter.ts","../src/adapters/shared/coordinate.converter.ts","../src/adapters/schemas/fit-message-keys.ts","../src/adapters/health/shared/health-metadata.builder.ts","../src/adapters/health/body-composition/fit-body-composition.schema.ts","../src/adapters/health/body-composition/health-body-composition.converter.ts","../src/adapters/health/body-composition/fit-to-krd-health-body-composition.converter.ts","../src/adapters/health/daily/fit-monitoring.schema.ts","../src/adapters/health/daily/health-daily.converter.ts","../src/adapters/health/daily/fit-to-krd-health-daily.converter.ts","../src/adapters/health/hrv/fit-hrv.schema.ts","../src/adapters/health/hrv/health-hrv.converter.ts","../src/adapters/health/hrv/fit-to-krd-health-hrv.converter.ts","../src/adapters/health/sleep/fit-sleep-level.schema.ts","../src/adapters/health/sleep/health-sleep.converter.ts","../src/adapters/health/sleep/fit-to-krd-health-sleep.converter.ts","../src/adapters/health/stress/fit-stress.schema.ts","../src/adapters/health/stress/health-stress.converter.ts","../src/adapters/health/stress/fit-to-krd-health-stress.converter.ts","../src/adapters/health/weight/fit-weight-scale.schema.ts","../src/adapters/health/weight/health-weight.converter.ts","../src/adapters/health/weight/fit-to-krd-health-weight.converter.ts","../src/adapters/event/event-type-maps.ts","../src/adapters/event/event.mapper.ts","../src/adapters/schemas/fit-event.ts","../src/adapters/event/fit-to-krd-event.converter.ts","../src/adapters/extensions/developer-fields.extractor.ts","../src/adapters/extensions/extensions.extractor.ts","../src/adapters/schemas/fit-lap-trigger.ts","../src/adapters/schemas/fit-sport.ts","../src/adapters/schemas/fit-lap.ts","../src/adapters/lap/lap-trigger.mapper.ts","../src/adapters/lap/fit-to-krd-lap.mapper.ts","../src/adapters/lap/fit-to-krd-lap.converter.ts","../src/adapters/schemas/fit-record.ts","../src/adapters/record/record-from-fit.mapper.ts","../src/adapters/record/fit-to-krd-record.converter.ts","../src/adapters/schemas/fit-session.ts","../src/adapters/session/session.mapper.ts","../src/adapters/session/fit-to-krd-session.converter.ts","../src/adapters/messages/activity.mapper.ts","../src/adapters/messages/file-type-detector.ts","../src/adapters/shared/type-guards.ts","../src/adapters/metadata/metadata.mapper.ts","../src/adapters/length-unit/length-unit.mapper.ts","../src/adapters/duration/duration-converters.ts","../src/adapters/duration/repeat-duration-converters.ts","../src/adapters/duration/duration.converter.ts","../src/adapters/duration/duration.mapper.ts","../src/adapters/target/target-cadence.converter.ts","../src/adapters/target/target-heart-rate.converter.ts","../src/adapters/target/target-pace.converter.ts","../src/adapters/target/power-helpers.ts","../src/adapters/target/target-power.converter.ts","../src/adapters/target/target-stroke.converter.ts","../src/adapters/target/target.converter.ts","../src/adapters/target/target.mapper.ts","../src/adapters/workout/step.mapper.ts","../src/adapters/workout/repetition.builder.ts","../src/adapters/workout/workout.mapper.ts","../src/adapters/messages/messages.validator.ts","../src/adapters/messages/workout.mapper.ts","../src/adapters/messages/messages.mapper.ts","../src/adapters/garmin-fitsdk.ts","../src/index.ts"],"names":["z","durationTypeSchema","targetTypeSchema","targetUnitSchema","isRepetitionBlock","createFitParsingError","HEALTH_VERSION","KRD_VERSION","fileTypeSchema","toIsoString","MS_PER_S","convertCadenceTarget","convertHeartRateTarget","convertPaceTarget","convertPowerTarget"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * FIT Message Numbers from Garmin FIT SDK Profile.\n * Source: @garmin/fitsdk Profile.MesgNum\n */\n\nexport const FIT_MESSAGE_NUMBERS = {\n FILE_ID: 0,\n WORKOUT: 26,\n WORKOUT_STEP: 27,\n // Health domain (KRD v2.0)\n WEIGHT_SCALE: 30,\n BODY_COMPOSITION: 41,\n STRESS_LEVEL: 227,\n MONITORING_INFO: 103,\n MONITORING: 55,\n SLEEP_LEVEL: 275,\n HRV_STATUS_SUMMARY: 370,\n HRV_VALUE: 371,\n} as const;\n\n/**\n * FIT file_type values that carry health-domain payloads.\n * Source: @garmin/fitsdk Profile.types.file\n */\nexport const FIT_HEALTH_FILE_TYPES = {\n WEIGHT: \"weight\",\n MONITORING_A: \"monitoringA\",\n MONITORING_DAILY: \"monitoringDaily\",\n MONITORING_B: \"monitoringB\",\n SLEEP: \"sleep\",\n} as const;\n\nexport type FitHealthFileType =\n (typeof FIT_HEALTH_FILE_TYPES)[keyof typeof FIT_HEALTH_FILE_TYPES];\n\nconst HEALTH_FILE_TYPE_VALUES: readonly string[] = Object.values(\n FIT_HEALTH_FILE_TYPES\n);\n\nexport const isFitHealthFileType = (\n fileType: unknown\n): fileType is FitHealthFileType =>\n typeof fileType === \"string\" && HEALTH_FILE_TYPE_VALUES.includes(fileType);\n","import { z } from \"zod\";\n\n/**\n * FIT file type enum schema\n *\n * Defines the type of data contained in the FIT file.\n * Used in FILE_ID message to identify file purpose.\n *\n * @see https://developer.garmin.com/fit/file-types/\n */\nexport const fitFileTypeSchema = z.enum([\n \"device\",\n \"settings\",\n \"sport\",\n \"activity\",\n \"workout\",\n \"course\",\n \"schedules\",\n \"weight\",\n \"totals\",\n \"goals\",\n \"bloodPressure\",\n \"monitoringA\",\n \"activitySummary\",\n \"monitoringDaily\",\n \"monitoringB\",\n \"segment\",\n \"segmentList\",\n \"exdConfiguration\",\n]);\n\n/**\n * TypeScript type for FIT file type\n */\nexport type FitFileType = z.infer<typeof fitFileTypeSchema>;\n\n/**\n * Bidirectional mapping: FIT file type → numeric value\n *\n * Maps string file type to FIT protocol numeric values.\n */\nexport const FIT_FILE_TYPE_TO_NUMBER: Record<FitFileType, number> = {\n device: 1,\n settings: 2,\n sport: 3,\n activity: 4,\n workout: 5,\n course: 6,\n schedules: 7,\n weight: 9,\n totals: 10,\n goals: 11,\n bloodPressure: 14,\n monitoringA: 15,\n activitySummary: 20,\n monitoringDaily: 28,\n monitoringB: 32,\n segment: 34,\n segmentList: 35,\n exdConfiguration: 40,\n};\n\n/**\n * Bidirectional mapping: numeric value → FIT file type\n *\n * Maps FIT protocol numeric values to string file type.\n */\nexport const NUMBER_TO_FIT_FILE_TYPE: Record<number, FitFileType> = {\n 1: \"device\",\n 2: \"settings\",\n 3: \"sport\",\n 4: \"activity\",\n 5: \"workout\",\n 6: \"course\",\n 7: \"schedules\",\n 9: \"weight\",\n 10: \"totals\",\n 11: \"goals\",\n 14: \"bloodPressure\",\n 15: \"monitoringA\",\n 20: \"activitySummary\",\n 28: \"monitoringDaily\",\n 32: \"monitoringB\",\n 34: \"segment\",\n 35: \"segmentList\",\n 40: \"exdConfiguration\",\n};\n","import { z } from \"zod\";\n\nexport const fitSubSportSchema = z.enum([\n \"generic\",\n \"treadmill\",\n \"street\",\n \"trail\",\n \"track\",\n \"spin\",\n \"indoorCycling\",\n \"road\",\n \"mountain\",\n \"downhill\",\n \"recumbent\",\n \"cyclocross\",\n \"handCycling\",\n \"trackCycling\",\n \"indoorRowing\",\n \"elliptical\",\n \"stairClimbing\",\n \"lapSwimming\",\n \"openWater\",\n \"flexibilityTraining\",\n \"strengthTraining\",\n \"warmUp\",\n \"match\",\n \"exercise\",\n \"challenge\",\n \"indoorSkiing\",\n \"cardioTraining\",\n \"indoorWalking\",\n \"eBikeFitness\",\n \"bmx\",\n \"casualWalking\",\n \"speedWalking\",\n \"bikeToRunTransition\",\n \"runToBikeTransition\",\n \"swimToBikeTransition\",\n \"atv\",\n \"motocross\",\n \"backcountry\",\n \"resort\",\n \"rcDrone\",\n \"wingsuit\",\n \"whitewater\",\n \"skateSkiing\",\n \"yoga\",\n \"pilates\",\n \"indoorRunning\",\n \"gravelCycling\",\n \"eBikeMountain\",\n \"commuting\",\n \"mixedSurface\",\n \"navigate\",\n \"trackMe\",\n \"map\",\n \"singleGasDiving\",\n \"multiGasDiving\",\n \"gaugeDiving\",\n \"apneaDiving\",\n \"apneaHunting\",\n \"virtualActivity\",\n \"obstacle\",\n \"all\",\n]);\n\nexport type FitSubSport = z.infer<typeof fitSubSportSchema>;\n","import { type SubSport, subSportSchema } from \"@kaiord/core\";\n\nimport { type FitSubSport, fitSubSportSchema } from \"../schemas/fit-sub-sport\";\n\nconst FIT_TO_KRD_SUB_SPORT_MAP: Record<FitSubSport, SubSport> = {\n generic: \"generic\",\n treadmill: \"treadmill\",\n street: \"street\",\n trail: \"trail\",\n track: \"track\",\n spin: \"spin\",\n indoorCycling: \"indoor_cycling\",\n road: \"road\",\n mountain: \"mountain\",\n downhill: \"downhill\",\n recumbent: \"recumbent\",\n cyclocross: \"cyclocross\",\n handCycling: \"hand_cycling\",\n trackCycling: \"track_cycling\",\n indoorRowing: \"indoor_rowing\",\n elliptical: \"elliptical\",\n stairClimbing: \"stair_climbing\",\n lapSwimming: \"lap_swimming\",\n openWater: \"open_water\",\n flexibilityTraining: \"flexibility_training\",\n strengthTraining: \"strength_training\",\n warmUp: \"warm_up\",\n match: \"match\",\n exercise: \"exercise\",\n challenge: \"challenge\",\n indoorSkiing: \"indoor_skiing\",\n cardioTraining: \"cardio_training\",\n indoorWalking: \"indoor_walking\",\n eBikeFitness: \"e_bike_fitness\",\n bmx: \"bmx\",\n casualWalking: \"casual_walking\",\n speedWalking: \"speed_walking\",\n bikeToRunTransition: \"bike_to_run_transition\",\n runToBikeTransition: \"run_to_bike_transition\",\n swimToBikeTransition: \"swim_to_bike_transition\",\n atv: \"atv\",\n motocross: \"motocross\",\n backcountry: \"backcountry\",\n resort: \"resort\",\n rcDrone: \"rc_drone\",\n wingsuit: \"wingsuit\",\n whitewater: \"whitewater\",\n skateSkiing: \"skate_skiing\",\n yoga: \"yoga\",\n pilates: \"pilates\",\n indoorRunning: \"indoor_running\",\n gravelCycling: \"gravel_cycling\",\n eBikeMountain: \"e_bike_mountain\",\n commuting: \"commuting\",\n mixedSurface: \"mixed_surface\",\n navigate: \"navigate\",\n trackMe: \"track_me\",\n map: \"map\",\n singleGasDiving: \"single_gas_diving\",\n multiGasDiving: \"multi_gas_diving\",\n gaugeDiving: \"gauge_diving\",\n apneaDiving: \"apnea_diving\",\n apneaHunting: \"apnea_hunting\",\n virtualActivity: \"virtual_activity\",\n obstacle: \"obstacle\",\n all: \"all\",\n};\n\nconst KRD_TO_FIT_SUB_SPORT_MAP: Record<SubSport, FitSubSport> =\n Object.fromEntries(\n Object.entries(FIT_TO_KRD_SUB_SPORT_MAP).map(([fit, krd]) => [krd, fit])\n ) as Record<SubSport, FitSubSport>;\n\nexport const mapSubSportToKrd = (fitSubSport: unknown): SubSport => {\n const result = fitSubSportSchema.safeParse(fitSubSport);\n\n if (!result.success) {\n return subSportSchema.enum.generic;\n }\n\n return FIT_TO_KRD_SUB_SPORT_MAP[result.data] || subSportSchema.enum.generic;\n};\n\nexport const mapSubSportToFit = (krdSubSport: unknown): FitSubSport => {\n const result = subSportSchema.safeParse(krdSubSport);\n\n if (!result.success) {\n return fitSubSportSchema.enum.generic;\n }\n\n return (\n KRD_TO_FIT_SUB_SPORT_MAP[result.data] || fitSubSportSchema.enum.generic\n );\n};\n","import { Profile } from \"@garmin/fitsdk\";\nimport type { Logger } from \"@kaiord/core\";\n\nconst DEFAULT_MANUFACTURER = \"garmin\";\n\n/**\n * Maps KRD manufacturer string to valid FIT Profile manufacturer enum value.\n * Uses fuzzy matching (case-insensitive, prefix matching).\n */\nexport const mapManufacturer = (\n manufacturer: string | undefined,\n logger: Logger\n): string => {\n if (!manufacturer) {\n return DEFAULT_MANUFACTURER;\n }\n\n const manufacturerEnum = Profile.types.manufacturer;\n const manufacturerValues = Object.values(manufacturerEnum);\n const normalized = manufacturer.toLowerCase();\n\n const matched = manufacturerValues.find(\n (value) =>\n value.toLowerCase() === normalized ||\n value.toLowerCase().startsWith(normalized) ||\n normalized.startsWith(value.toLowerCase())\n );\n\n if (matched) return matched;\n\n logger.warn(\n `Unknown manufacturer \"${manufacturer}\", using fallback \"${DEFAULT_MANUFACTURER}\"`,\n { original: manufacturer, fallback: DEFAULT_MANUFACTURER }\n );\n return DEFAULT_MANUFACTURER;\n};\n","import type { RepetitionBlock, WorkoutStep } from \"@kaiord/core\";\nimport { isRepetitionBlock } from \"@kaiord/core\";\n\n/**\n * Counts the number of FIT-valid workout steps from a list of KRD steps.\n *\n * Each repetition block expands to its inner steps (recursively, since\n * inner steps may themselves be repetition blocks) plus one synthetic\n * repeat step in the FIT message stream.\n */\nexport const countValidSteps = (\n steps: Array<WorkoutStep | RepetitionBlock>\n): number => {\n let count = 0;\n for (const step of steps) {\n if (isRepetitionBlock(step)) {\n count += countValidSteps(step.steps) + 1;\n } else {\n count += 1;\n }\n }\n return count;\n};\n","import type { KRD, Logger, Workout } from \"@kaiord/core\";\n\nimport type { FitFileType } from \"../schemas/fit-file-type\";\nimport { FIT_FILE_TYPE_TO_NUMBER } from \"../schemas/fit-file-type\";\nimport { mapSubSportToFit } from \"../sub-sport/sub-sport.mapper\";\nimport { mapManufacturer } from \"./krd-to-fit-manufacturer.converter\";\nimport { countValidSteps } from \"./krd-to-fit-step-count.helpers\";\n\nconst resolveFitFileType = (krdType: KRD[\"type\"]): FitFileType => {\n if (krdType === \"structured_workout\") return \"workout\";\n if (krdType === \"recorded_activity\") return \"activity\";\n if (krdType === \"course\") return \"course\";\n return \"workout\";\n};\n\nconst assignParsedNumber = (\n target: Record<string, unknown>,\n key: string,\n raw: string\n): void => {\n const parsed = parseInt(raw, 10);\n if (!isNaN(parsed)) {\n target[key] = parsed;\n }\n};\n\nexport const convertMetadataToFileId = (\n krd: KRD,\n logger: Logger\n): Record<string, unknown> => {\n logger.debug(\"Converting metadata to file_id message\");\n\n const fileType = resolveFitFileType(krd.type);\n\n const fileId: Record<string, unknown> = {\n type: FIT_FILE_TYPE_TO_NUMBER[fileType],\n timeCreated: new Date(krd.metadata.created),\n manufacturer: mapManufacturer(krd.metadata.manufacturer, logger),\n };\n\n if (krd.metadata.product !== undefined) {\n assignParsedNumber(fileId, \"product\", krd.metadata.product);\n }\n\n if (krd.metadata.serialNumber) {\n assignParsedNumber(fileId, \"serialNumber\", krd.metadata.serialNumber);\n }\n\n return fileId;\n};\n\nexport const convertWorkoutMetadata = (\n workout: Workout,\n logger: Logger\n): Record<string, unknown> => {\n logger.debug(\"Converting workout metadata\");\n\n const numValidSteps = countValidSteps(workout.steps);\n\n const workoutMesg: Record<string, unknown> = {\n wktName: workout.name,\n sport: workout.sport,\n numValidSteps,\n };\n\n if (workout.subSport !== undefined) {\n workoutMesg.subSport = mapSubSportToFit(workout.subSport);\n }\n\n if (workout.poolLength !== undefined) {\n workoutMesg.poolLength = workout.poolLength;\n workoutMesg.poolLengthUnit = 0;\n }\n\n return workoutMesg;\n};\n","import { z } from \"zod\";\n\nexport const fitDurationTypeSchema = z.enum([\n \"time\",\n \"distance\",\n \"repeatUntilStepsCmplt\",\n \"repeatUntilHrGreaterThan\",\n \"hrLessThan\",\n \"hrGreaterThan\",\n \"calories\",\n \"powerLessThan\",\n \"powerGreaterThan\",\n \"repeatUntilTime\",\n \"repeatUntilDistance\",\n \"repeatUntilCalories\",\n \"repeatUntilHrLessThan\",\n \"repeatUntilPowerLessThan\",\n \"repeatUntilPowerGreaterThan\",\n \"open\",\n]);\n\nexport type FitDurationType = z.infer<typeof fitDurationTypeSchema>;\n","import { z } from \"zod\";\n\nexport const fitTargetTypeSchema = z.enum([\n \"power\",\n \"heartRate\",\n \"cadence\",\n \"speed\",\n \"swimStroke\",\n \"open\",\n]);\n\nexport type FitTargetType = z.infer<typeof fitTargetTypeSchema>;\n","import { z } from \"zod\";\n\nexport const fitEquipmentSchema = z.enum([\n \"none\",\n \"swimFins\",\n \"swimKickboard\",\n \"swimPaddles\",\n \"swimPullBuoy\",\n \"swimSnorkel\",\n]);\n\nexport type FitEquipment = z.infer<typeof fitEquipmentSchema>;\n","import { type Equipment, equipmentSchema } from \"@kaiord/core\";\n\nimport {\n type FitEquipment,\n fitEquipmentSchema,\n} from \"../schemas/fit-equipment\";\n\nconst FIT_TO_KRD_EQUIPMENT_MAP: Record<FitEquipment, Equipment> = {\n none: \"none\",\n swimFins: \"swim_fins\",\n swimKickboard: \"swim_kickboard\",\n swimPaddles: \"swim_paddles\",\n swimPullBuoy: \"swim_pull_buoy\",\n swimSnorkel: \"swim_snorkel\",\n};\n\nconst KRD_TO_FIT_EQUIPMENT_MAP: Record<Equipment, FitEquipment> =\n Object.fromEntries(\n Object.entries(FIT_TO_KRD_EQUIPMENT_MAP).map(([fit, krd]) => [krd, fit])\n ) as Record<Equipment, FitEquipment>;\n\nexport const mapEquipmentToKrd = (fitEquipment: unknown): Equipment => {\n const result = fitEquipmentSchema.safeParse(fitEquipment);\n\n if (!result.success) {\n return equipmentSchema.enum.none;\n }\n\n return FIT_TO_KRD_EQUIPMENT_MAP[result.data] || equipmentSchema.enum.none;\n};\n\nexport const mapEquipmentToFit = (krdEquipment: unknown): FitEquipment => {\n const result = equipmentSchema.safeParse(krdEquipment);\n\n if (!result.success) {\n return fitEquipmentSchema.enum.none;\n }\n\n return KRD_TO_FIT_EQUIPMENT_MAP[result.data] || fitEquipmentSchema.enum.none;\n};\n","import type { Duration } from \"@kaiord/core\";\nimport { durationTypeSchema } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../../schemas/fit-duration\";\n\nexport const convertConditionalDuration = (\n duration: Duration,\n message: Record<string, unknown>\n): boolean => {\n if (duration.type === durationTypeSchema.enum.heart_rate_less_than) {\n message.durationType = fitDurationTypeSchema.enum.hrLessThan;\n message.durationHr = duration.bpm;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.power_less_than) {\n message.durationType = fitDurationTypeSchema.enum.powerLessThan;\n message.durationPower = duration.watts;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.power_greater_than) {\n message.durationType = fitDurationTypeSchema.enum.powerGreaterThan;\n message.durationPower = duration.watts;\n return true;\n }\n\n return false;\n};\n","import type { Duration } from \"@kaiord/core\";\nimport { durationTypeSchema } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../../schemas/fit-duration\";\n\nexport const convertRepeatDuration = (\n duration: Duration,\n message: Record<string, unknown>\n): boolean => {\n if (duration.type === durationTypeSchema.enum.repeat_until_time) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilTime;\n message.durationTime = duration.seconds;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.repeat_until_distance) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilDistance;\n message.durationDistance = duration.meters;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.repeat_until_calories) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilCalories;\n message.durationCalories = duration.calories;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n return false;\n};\n","import type { Duration } from \"@kaiord/core\";\nimport { durationTypeSchema } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../../schemas/fit-duration\";\n\nexport const convertRepeatHrPowerDuration = (\n duration: Duration,\n message: Record<string, unknown>\n): boolean => {\n if (\n duration.type ===\n durationTypeSchema.enum.repeat_until_heart_rate_greater_than\n ) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilHrGreaterThan;\n message.durationHr = duration.bpm;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n if (\n duration.type === durationTypeSchema.enum.repeat_until_heart_rate_less_than\n ) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilHrLessThan;\n message.durationHr = duration.bpm;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.repeat_until_power_less_than) {\n message.durationType = fitDurationTypeSchema.enum.repeatUntilPowerLessThan;\n message.durationPower = duration.watts;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n if (\n duration.type === durationTypeSchema.enum.repeat_until_power_greater_than\n ) {\n message.durationType =\n fitDurationTypeSchema.enum.repeatUntilPowerGreaterThan;\n message.durationPower = duration.watts;\n message.durationStep = duration.repeatFrom;\n return true;\n }\n\n return false;\n};\n","import type { Duration } from \"@kaiord/core\";\nimport { durationTypeSchema } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../../schemas/fit-duration\";\n\nexport const convertSimpleDuration = (\n duration: Duration,\n message: Record<string, unknown>\n): boolean => {\n if (duration.type === durationTypeSchema.enum.time) {\n message.durationType = fitDurationTypeSchema.enum.time;\n message.durationTime = duration.seconds;\n message.durationValue = duration.seconds * 1000; // durationValue is in milliseconds\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.distance) {\n message.durationType = fitDurationTypeSchema.enum.distance;\n message.durationDistance = duration.meters;\n return true;\n }\n\n if (duration.type === durationTypeSchema.enum.calories) {\n message.durationType = fitDurationTypeSchema.enum.calories;\n message.durationCalories = duration.calories;\n return true;\n }\n\n return false;\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../schemas/fit-duration\";\nimport { convertConditionalDuration } from \"./duration-converters/conditional\";\nimport { convertRepeatDuration } from \"./duration-converters/repeat\";\nimport { convertRepeatHrPowerDuration } from \"./duration-converters/repeat-hr-power\";\nimport { convertSimpleDuration } from \"./duration-converters/simple\";\n\nexport const convertDuration = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n const { duration } = step;\n\n if (convertSimpleDuration(duration, message)) return;\n if (convertConditionalDuration(duration, message)) return;\n if (convertRepeatDuration(duration, message)) return;\n if (convertRepeatHrPowerDuration(duration, message)) return;\n\n message.durationType = fitDurationTypeSchema.enum.open;\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\n\nexport const convertCadenceTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n message.targetType = fitTargetTypeSchema.enum.cadence;\n if (step.target.type !== targetTypeSchema.enum.cadence) return;\n\n const value = step.target.value;\n if (value.unit === targetUnitSchema.enum.range) {\n message.targetValue = 0;\n message.customTargetCadenceLow = value.min;\n message.customTargetCadenceHigh = value.max;\n } else {\n message.targetValue = 0;\n message.customTargetCadenceLow = value.value;\n message.customTargetCadenceHigh = value.value;\n }\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\n\nexport const convertHeartRateTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n message.targetType = fitTargetTypeSchema.enum.heartRate;\n if (step.target.type !== targetTypeSchema.enum.heart_rate) return;\n\n const value = step.target.value;\n if (value.unit === targetUnitSchema.enum.zone) {\n message.targetHrZone = value.value;\n } else if (value.unit === targetUnitSchema.enum.range) {\n message.targetValue = 0;\n message.customTargetHeartRateLow = value.min;\n message.customTargetHeartRateHigh = value.max;\n } else if (value.unit === targetUnitSchema.enum.bpm) {\n // Garmin encoding: Absolute bpm needs +100 offset\n message.targetValue = value.value + 100;\n } else if (value.unit === targetUnitSchema.enum.percent_max) {\n // Garmin encoding: Percentage max HR has no offset\n message.targetValue = value.value;\n }\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\n\nexport const convertPaceTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n message.targetType = fitTargetTypeSchema.enum.speed;\n if (step.target.type !== targetTypeSchema.enum.pace) return;\n\n const value = step.target.value;\n if (value.unit === targetUnitSchema.enum.zone) {\n message.targetSpeedZone = value.value;\n } else if (value.unit === targetUnitSchema.enum.range) {\n message.targetValue = 0;\n message.customTargetSpeedLow = value.min;\n message.customTargetSpeedHigh = value.max;\n } else {\n message.targetValue = 0;\n message.customTargetSpeedLow = value.value;\n message.customTargetSpeedHigh = value.value;\n }\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\n\nexport const convertPowerTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n message.targetType = fitTargetTypeSchema.enum.power;\n if (step.target.type !== targetTypeSchema.enum.power) return;\n\n const value = step.target.value;\n if (value.unit === targetUnitSchema.enum.zone) {\n message.targetPowerZone = value.value;\n } else if (value.unit === targetUnitSchema.enum.range) {\n message.targetValue = 0;\n message.customTargetPowerLow = value.min;\n message.customTargetPowerHigh = value.max;\n } else if (value.unit === targetUnitSchema.enum.watts) {\n // Garmin encoding: Absolute watts need +1000 offset\n message.targetValue = value.value + 1000;\n } else if (value.unit === targetUnitSchema.enum.percent_ftp) {\n // Garmin encoding: Percentage FTP has no offset\n message.targetValue = value.value;\n }\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\n\n/**\n * Converts KRD stroke_type target to FIT swimStroke target.\n *\n * The stroke value is already a FIT-compatible number (0-5):\n * 0 = freestyle, 1 = backstroke, 2 = breaststroke, 3 = butterfly, 4 = drill, 5 = mixed/IM\n */\nexport const convertStrokeTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n message.targetType = fitTargetTypeSchema.enum.swimStroke;\n if (step.target.type !== targetTypeSchema.enum.stroke_type) return;\n\n // Zod discriminated union guarantees value exists when type is stroke_type\n const strokeValue = step.target.value as { unit: string; value: number };\n\n message.targetValue = strokeValue.value;\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { targetTypeSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\nimport { convertCadenceTarget } from \"./krd-to-fit-target-cadence.mapper\";\nimport { convertHeartRateTarget } from \"./krd-to-fit-target-heart-rate.converter\";\nimport { convertPaceTarget } from \"./krd-to-fit-target-pace.mapper\";\nimport { convertPowerTarget } from \"./krd-to-fit-target-power.converter\";\nimport { convertStrokeTarget } from \"./krd-to-fit-target-stroke.converter\";\n\nexport const convertTarget = (\n step: WorkoutStep,\n message: Record<string, unknown>\n): void => {\n if (step.target.type === targetTypeSchema.enum.open) {\n message.targetType = fitTargetTypeSchema.enum.open;\n return;\n }\n\n if (step.target.type === targetTypeSchema.enum.power) {\n convertPowerTarget(step, message);\n } else if (step.target.type === targetTypeSchema.enum.heart_rate) {\n convertHeartRateTarget(step, message);\n } else if (step.target.type === targetTypeSchema.enum.cadence) {\n convertCadenceTarget(step, message);\n } else if (step.target.type === targetTypeSchema.enum.pace) {\n convertPaceTarget(step, message);\n } else if (step.target.type === targetTypeSchema.enum.stroke_type) {\n convertStrokeTarget(step, message);\n }\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\nimport { createFitParsingError } from \"@kaiord/core\";\n\nimport { mapEquipmentToFit } from \"../equipment/equipment.mapper\";\nimport { convertDuration } from \"./krd-to-fit-duration.mapper\";\nimport { convertTarget } from \"./krd-to-fit-target.converter\";\n\n/** FIT protocol maximum length for notes field */\nconst FIT_NOTES_MAX_LENGTH = 256;\n\nexport type TruncationBehavior = \"truncate\" | \"error\";\n\nexport type ConvertWorkoutStepOptions = {\n /** How to handle notes exceeding 256 characters. Default: \"truncate\" */\n notesTruncation?: TruncationBehavior;\n};\n\n/**\n * Converts a KRD workout step to a FIT workout step message.\n */\nexport const convertWorkoutStep = (\n step: WorkoutStep,\n messageIndex: number,\n logger: Logger,\n options: ConvertWorkoutStepOptions = {}\n): Record<string, unknown> => {\n const { notesTruncation = \"truncate\" } = options;\n\n logger.debug(\"Converting workout step\", { stepIndex: step.stepIndex });\n\n const workoutStepMesg: Record<string, unknown> = {\n messageIndex,\n };\n\n if (step.name) {\n workoutStepMesg.wktStepName = step.name;\n }\n\n if (step.intensity) {\n workoutStepMesg.intensity = step.intensity;\n }\n\n if (step.notes !== undefined) {\n workoutStepMesg.notes = convertNotes(\n step.notes,\n step.stepIndex,\n notesTruncation,\n logger\n );\n }\n\n if (step.equipment !== undefined) {\n workoutStepMesg.equipment = mapEquipmentToFit(step.equipment);\n }\n\n convertDuration(step, workoutStepMesg);\n convertTarget(step, workoutStepMesg);\n\n return workoutStepMesg;\n};\n\nconst convertNotes = (\n notes: string,\n stepIndex: number,\n behavior: TruncationBehavior,\n logger: Logger\n): string => {\n if (notes.length <= FIT_NOTES_MAX_LENGTH) {\n return notes;\n }\n\n if (behavior === \"error\") {\n throw createFitParsingError(\n `Notes exceed ${FIT_NOTES_MAX_LENGTH} characters at step ${stepIndex} ` +\n `(length: ${notes.length}). Use notesTruncation: \"truncate\" to auto-truncate.`\n );\n }\n\n logger.warn(\n `Notes truncated from ${notes.length} to ${FIT_NOTES_MAX_LENGTH} characters`,\n { stepIndex, originalLength: notes.length }\n );\n return notes.substring(0, FIT_NOTES_MAX_LENGTH);\n};\n","import type { RepetitionBlock, Workout } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\nimport { isRepetitionBlock } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../schemas/fit-duration\";\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\nimport { FIT_MESSAGE_NUMBERS } from \"../shared/message-numbers\";\nimport {\n convertWorkoutStep,\n type ConvertWorkoutStepOptions,\n} from \"./krd-to-fit-step.mapper\";\n\nexport type ConvertWorkoutStepsOptions = ConvertWorkoutStepOptions;\n\nexport const convertWorkoutSteps = (\n workout: Workout,\n logger: Logger,\n options: ConvertWorkoutStepsOptions = {}\n): Array<unknown> => {\n logger.debug(\"Converting workout steps\", { stepCount: workout.steps.length });\n\n const messages: Array<unknown> = [];\n let messageIndex = 0;\n\n for (const step of workout.steps) {\n if (isRepetitionBlock(step)) {\n const repetitionMessages = convertRepetitionBlock(\n step,\n messageIndex,\n logger,\n options\n );\n messages.push(...repetitionMessages);\n messageIndex += repetitionMessages.length;\n } else {\n const stepMessage = convertWorkoutStep(\n step,\n messageIndex,\n logger,\n options\n );\n messages.push(stepMessage);\n messageIndex += 1;\n }\n }\n\n return messages;\n};\n\nconst convertRepetitionBlock = (\n block: RepetitionBlock,\n startIndex: number,\n logger: Logger,\n options: ConvertWorkoutStepsOptions\n): Array<unknown> => {\n logger.debug(\"Converting repetition block\", {\n repeatCount: block.repeatCount,\n stepCount: block.steps.length,\n });\n\n const messages: Array<unknown> = [];\n let messageIndex = startIndex;\n\n for (const step of block.steps) {\n const stepMessage = convertWorkoutStep(step, messageIndex, logger, options);\n messages.push(stepMessage);\n messageIndex += 1;\n }\n\n const repeatMessage: Record<string, unknown> = {\n mesgNum: FIT_MESSAGE_NUMBERS.WORKOUT_STEP,\n messageIndex,\n durationType: fitDurationTypeSchema.enum.repeatUntilStepsCmplt,\n durationStep: startIndex,\n repeatSteps: block.repeatCount,\n targetType: fitTargetTypeSchema.enum.open,\n };\n messages.push(repeatMessage);\n\n return messages;\n};\n","import type { Logger } from \"@kaiord/core\";\nimport type { KRD } from \"@kaiord/core\";\nimport { type Workout, workoutSchema } from \"@kaiord/core\";\nimport { createFitParsingError } from \"@kaiord/core\";\n\nimport { FIT_MESSAGE_NUMBERS } from \"../shared/message-numbers\";\nimport {\n convertMetadataToFileId,\n convertWorkoutMetadata,\n} from \"./krd-to-fit-metadata.converter\";\nimport { convertWorkoutSteps } from \"./krd-to-fit-workout.mapper\";\n\n/**\n * Safely converts unknown to Record<string, unknown>.\n * Returns empty object if value is not a valid object.\n */\nconst toRecord = (value: unknown): Record<string, unknown> => {\n if (typeof value === \"object\" && value !== null) {\n return value as Record<string, unknown>;\n }\n return {};\n};\n\n/**\n * Extracts and validates workout data from KRD extensions.\n * Throws if workout is missing or invalid.\n */\nconst extractWorkout = (krd: KRD, logger: Logger): Workout => {\n const rawWorkout = krd.extensions?.structured_workout;\n if (!rawWorkout) {\n throw createFitParsingError(\"KRD missing workout data in extensions\");\n }\n\n const result = workoutSchema.safeParse(rawWorkout);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\"; \");\n logger.error(\"Invalid workout data in KRD extensions\", { issues });\n throw createFitParsingError(`Invalid workout data: ${issues}`);\n }\n\n return result.data;\n};\n\nexport const convertKRDToMessages = (\n krd: KRD,\n logger: Logger\n): Array<unknown> => {\n logger.debug(\"Converting KRD to FIT messages\");\n\n const messages: Array<unknown> = [];\n\n const fileIdMessage = convertMetadataToFileId(krd, logger);\n messages.push({\n mesgNum: FIT_MESSAGE_NUMBERS.FILE_ID,\n ...fileIdMessage,\n });\n\n const workout = extractWorkout(krd, logger);\n\n const workoutMessage = convertWorkoutMetadata(workout, logger);\n messages.push({\n mesgNum: FIT_MESSAGE_NUMBERS.WORKOUT,\n ...workoutMessage,\n });\n\n const workoutStepMessages = convertWorkoutSteps(workout, logger);\n for (const stepMessage of workoutStepMessages) {\n messages.push({\n mesgNum: FIT_MESSAGE_NUMBERS.WORKOUT_STEP,\n ...toRecord(stepMessage),\n });\n }\n\n logger.debug(\"Converted KRD to FIT messages\", {\n messageCount: messages.length,\n });\n\n return messages;\n};\n","/**\n * Coordinate conversion utilities for FIT ↔ KRD.\n *\n * FIT uses semicircles for coordinates (signed 32-bit integer).\n * KRD uses degrees (-90 to 90 for lat, -180 to 180 for lon).\n */\n\nconst SEMICIRCLES_TO_DEGREES = 180 / Math.pow(2, 31);\nconst DEGREES_TO_SEMICIRCLES = Math.pow(2, 31) / 180;\n\n/**\n * Converts FIT semicircles to degrees.\n * @param semicircles - Coordinate in semicircles (signed 32-bit integer)\n * @returns Coordinate in degrees\n */\nexport const semicirclesToDegrees = (semicircles: number): number =>\n semicircles * SEMICIRCLES_TO_DEGREES;\n\n/**\n * Converts degrees to FIT semicircles.\n * @param degrees - Coordinate in degrees\n * @returns Coordinate in semicircles (rounded to integer)\n */\nexport const degreesToSemicircles = (degrees: number): number =>\n Math.round(degrees * DEGREES_TO_SEMICIRCLES);\n\n/**\n * Validates that coordinates are within valid ranges.\n * Handles edge cases: NaN, Infinity.\n *\n * @param latSemicircles - Latitude in semicircles\n * @param lonSemicircles - Longitude in semicircles\n * @returns true if coordinates are valid\n */\nexport const validateCoordinates = (\n latSemicircles: number,\n lonSemicircles: number\n): boolean => {\n if (!Number.isFinite(latSemicircles) || !Number.isFinite(lonSemicircles)) {\n return false;\n }\n\n const degreesLat = semicirclesToDegrees(latSemicircles);\n const degreesLon = semicirclesToDegrees(lonSemicircles);\n\n return (\n degreesLat >= -90 &&\n degreesLat <= 90 &&\n degreesLon >= -180 &&\n degreesLon <= 180\n );\n};\n","import { z } from \"zod\";\n\nexport const fitMessageKeySchema = z.enum([\n \"fileIdMesgs\",\n \"workoutMesgs\",\n \"workoutStepMesgs\",\n \"sessionMesgs\",\n \"recordMesgs\",\n \"eventMesgs\",\n \"lapMesgs\",\n // Health domain (KRD v2.0)\n \"sleepLevelMesgs\",\n \"monitoringMesgs\",\n \"monitoringInfoMesgs\",\n \"weightScaleMesgs\",\n \"bodyCompositionMesgs\",\n \"hrvStatusSummaryMesgs\",\n \"hrvValueMesgs\",\n \"stressLevelMesgs\",\n]);\n\nexport type FitMessageKey = z.infer<typeof fitMessageKeySchema>;\n","/**\n * Shared helpers for building the `metadata` block of a health KRD\n * from the raw FIT file_id message. Health KRDs MUST omit\n * `metadata.sport` per the conditional refinement in `krd-format`, so\n * the produced metadata is workout-free by construction.\n */\n\nconst isString = (value: unknown): value is string => typeof value === \"string\";\nconst isNumber = (value: unknown): value is number => typeof value === \"number\";\n\nconst MS_PER_S = 1000;\n\nexport const convertFitTimeCreatedToIso = (timeCreated: unknown): string => {\n if (timeCreated instanceof Date) return timeCreated.toISOString();\n if (isNumber(timeCreated))\n return new Date(timeCreated * MS_PER_S).toISOString();\n return new Date().toISOString();\n};\n\nexport type HealthMetadata = {\n created: string;\n manufacturer?: string;\n product?: string;\n};\n\nexport const buildHealthMetadata = (\n fileId: Record<string, unknown> | undefined\n): HealthMetadata => ({\n created: convertFitTimeCreatedToIso(fileId?.timeCreated),\n manufacturer: isString(fileId?.manufacturer)\n ? fileId.manufacturer\n : undefined,\n product: isNumber(fileId?.product) ? String(fileId.product) : undefined,\n});\n","import { z } from \"zod\";\n\n/**\n * FIT-side schema for `body_composition` (mesgNum 41). Garmin emits\n * this dedicated message from smart scales that report a full body\n * composition (Index S2 and equivalents). Simpler scales only emit a\n * `weight_scale` message with `percentFat`; that path is handled by\n * the weight slice instead.\n */\nexport const fitBodyCompositionSchema = z.object({\n timestamp: z.union([z.date(), z.string(), z.number()]),\n percentFat: z.number().optional(),\n percentHydration: z.number().optional(),\n visceralFatRating: z.number().optional(),\n boneMass: z.number().optional(),\n muscleMass: z.number().optional(),\n basalMet: z.number().optional(),\n bmi: z.number().optional(),\n});\n\nexport type FitBodyComposition = z.infer<typeof fitBodyCompositionSchema>;\n","import type { BodyComposition } from \"@kaiord/core\";\n\nimport type { FitBodyComposition } from \"./fit-body-composition.schema\";\n\nconst HEALTH_VERSION = \"2.0\";\n\nconst toIsoString = (value: FitBodyComposition[\"timestamp\"]): string => {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"number\") return new Date(value * 1000).toISOString();\n return new Date(value).toISOString();\n};\n\nconst FIT_KG_SCALE = 100;\n\nconst fromScaledKg = (value: number | undefined): number | undefined =>\n value === undefined ? undefined : value / FIT_KG_SCALE;\n\nconst toScaledKg = (value: number | undefined): number | undefined =>\n value === undefined ? undefined : Math.round(value * FIT_KG_SCALE);\n\nconst collectMeasurements = (\n fit: FitBodyComposition\n): Partial<BodyComposition> => {\n const out: Partial<BodyComposition> = {};\n if (fit.percentFat !== undefined) out.bodyFatPercent = fit.percentFat;\n if (fit.percentHydration !== undefined)\n out.bodyWaterPercent = fit.percentHydration;\n const leanMassKilograms = fromScaledKg(fit.muscleMass);\n if (leanMassKilograms !== undefined)\n out.leanMassKilograms = leanMassKilograms;\n const boneMassKilograms = fromScaledKg(fit.boneMass);\n if (boneMassKilograms !== undefined)\n out.boneMassKilograms = boneMassKilograms;\n if (fit.bmi !== undefined) out.bmi = fit.bmi;\n return out;\n};\n\n/**\n * Maps a single FIT `body_composition` message into the KRD payload.\n *\n * Returns `undefined` when none of the measurement fields are\n * present (the KRD schema requires at-least-one). Garmin scales bone\n * and muscle mass by 100 (uint16 raw 1234 = 12.34 kg); the SDK does\n * not auto-unscale these custom fields so the mapper divides.\n */\nexport const mapFitBodyCompositionToKrd = (\n fit: FitBodyComposition\n): BodyComposition | undefined => {\n const measurements = collectMeasurements(fit);\n if (Object.keys(measurements).length === 0) return undefined;\n return {\n kind: \"bodyComposition\",\n version: HEALTH_VERSION,\n measuredAt: toIsoString(fit.timestamp),\n ...measurements,\n };\n};\n\n/**\n * Inverse mapper — KRD body composition → FIT `body_composition`\n * message shape.\n */\nexport const mapKrdBodyCompositionToFit = (\n body: BodyComposition\n): FitBodyComposition => ({\n timestamp: new Date(body.measuredAt),\n ...(body.bodyFatPercent !== undefined && { percentFat: body.bodyFatPercent }),\n ...(body.bodyWaterPercent !== undefined && {\n percentHydration: body.bodyWaterPercent,\n }),\n ...(body.leanMassKilograms !== undefined && {\n muscleMass: toScaledKg(body.leanMassKilograms),\n }),\n ...(body.boneMassKilograms !== undefined && {\n boneMass: toScaledKg(body.boneMassKilograms),\n }),\n ...(body.bmi !== undefined && { bmi: body.bmi }),\n});\n","import type { KRD, Logger } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../../shared/types\";\nimport { buildHealthMetadata } from \"../shared/health-metadata.builder\";\nimport {\n type FitBodyComposition,\n fitBodyCompositionSchema,\n} from \"./fit-body-composition.schema\";\nimport { mapFitBodyCompositionToKrd } from \"./health-body-composition.converter\";\n\nconst KRD_VERSION = \"2.0\" as const;\n\nconst parseFirstBodyComposition = (\n raw: unknown[],\n logger: Logger\n): FitBodyComposition | undefined => {\n for (const entry of raw) {\n const result = fitBodyCompositionSchema.safeParse(entry);\n if (result.success) return result.data;\n logger.warn(\"Skipping malformed body_composition message\", {\n issues: result.error.issues,\n });\n }\n return undefined;\n};\n\n/**\n * Maps a FIT file carrying `body_composition` messages to a KRD\n * `body_composition`. When the FIT contains multiple body composition\n * messages (e.g. a multi-user scale dump), only the first valid one\n * is mapped — the rest are dropped silently. Per-user fan-out is out\n * of scope for v2.0.\n */\nexport const convertFitToKrdHealthBodyComposition = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n const fileId = messages[fitMessageKeySchema.enum.fileIdMesgs]?.[0] as\n | Record<string, unknown>\n | undefined;\n const rawBody = messages[fitMessageKeySchema.enum.bodyCompositionMesgs] ?? [];\n const fitBody = parseFirstBodyComposition(rawBody, logger);\n const body = fitBody ? mapFitBodyCompositionToKrd(fitBody) : undefined;\n\n return {\n version: KRD_VERSION,\n type: fileTypeSchema.enum.body_composition,\n metadata: buildHealthMetadata(fileId),\n extensions: body ? { health: { bodyComposition: body } } : undefined,\n };\n};\n","import { z } from \"zod\";\n\n/**\n * FIT-side schema for `monitoring_info` (mesgNum 103) — the per-file\n * monitoring header that carries day-level metadata.\n */\nexport const fitMonitoringInfoSchema = z.object({\n timestamp: z.union([z.date(), z.string(), z.number()]),\n restingMetabolicRate: z.number().optional(),\n});\n\n/**\n * FIT-side schema for `monitoring` (mesgNum 55). Garmin emits many of\n * these per day; most are sparse (just timestamp + heart rate or\n * activity-type counters), and one carries the day summary with\n * `steps`, `activeCalories`, and `durationMin: 1440`.\n */\nexport const fitMonitoringSchema = z.object({\n timestamp: z.union([z.date(), z.string(), z.number()]).optional(),\n steps: z.number().int().nonnegative().optional(),\n activeCalories: z.number().int().nonnegative().optional(),\n durationMin: z.number().int().nonnegative().optional(),\n cycles: z.number().nonnegative().optional(),\n distance: z.number().nonnegative().optional(),\n activeTime: z.number().int().nonnegative().optional(),\n activityType: z.string().optional(),\n});\n\nexport type FitMonitoringInfo = z.infer<typeof fitMonitoringInfoSchema>;\nexport type FitMonitoring = z.infer<typeof fitMonitoringSchema>;\n","import type { DailyWellness } from \"@kaiord/core\";\n\nimport type { FitMonitoring, FitMonitoringInfo } from \"./fit-monitoring.schema\";\n\nconst HEALTH_VERSION = \"2.0\";\nconst FULL_DAY_MIN = 1440;\n\nconst toIsoDate = (\n value: FitMonitoringInfo[\"timestamp\"] | undefined\n): string | undefined => {\n if (!value) return undefined;\n const date =\n value instanceof Date\n ? value\n : typeof value === \"number\"\n ? new Date(value * 1000)\n : new Date(value);\n return date.toISOString().slice(0, 10);\n};\n\nconst sumSteps = (samples: FitMonitoring[]): number =>\n samples.reduce((sum, s) => sum + (s.steps ?? 0), 0);\n\nconst sumActiveCalories = (samples: FitMonitoring[]): number =>\n samples.reduce((sum, s) => sum + (s.activeCalories ?? 0), 0);\n\nconst pickDate = (\n info: FitMonitoringInfo | undefined,\n samples: FitMonitoring[]\n): string | undefined => {\n if (info) return toIsoDate(info.timestamp);\n const firstWithTs = samples.find((s) => s.timestamp);\n return firstWithTs ? toIsoDate(firstWithTs.timestamp) : undefined;\n};\n\n/**\n * Aggregates a day's FIT `monitoring` + `monitoring_info` messages\n * into the KRD daily wellness payload. Steps and active calories are\n * summed across all monitoring messages; resting calories come from\n * `monitoring_info.restingMetabolicRate`. Intensity-minute fields\n * default to 0 because the source fixture does not emit them.\n */\nexport const mapFitMonitoringToKrdDaily = (\n info: FitMonitoringInfo | undefined,\n monitoring: FitMonitoring[]\n): DailyWellness | undefined => {\n const date = pickDate(info, monitoring);\n if (!date) return undefined;\n return {\n kind: \"daily\",\n version: HEALTH_VERSION,\n date,\n steps: sumSteps(monitoring),\n activeCalories: sumActiveCalories(monitoring),\n restingCalories: info?.restingMetabolicRate ?? 0,\n intensityMinutes: { moderate: 0, vigorous: 0 },\n };\n};\n\n/**\n * Inverse mapper — KRD daily wellness → FIT monitoring_info + one\n * day-summary monitoring message. Per-sample messages cannot be\n * reconstructed from the KRD summary, so the FIT output is a\n * minimum-viable header + summary pair, not a byte-equal copy.\n */\nexport const mapKrdDailyToFit = (\n daily: DailyWellness\n): { info: FitMonitoringInfo; summary: FitMonitoring } => {\n const timestamp = new Date(`${daily.date}T00:00:00.000Z`);\n return {\n info: { timestamp, restingMetabolicRate: daily.restingCalories },\n summary: {\n timestamp,\n steps: daily.steps,\n activeCalories: daily.activeCalories,\n durationMin: FULL_DAY_MIN,\n },\n };\n};\n","import type { KRD, Logger } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../../shared/types\";\nimport { buildHealthMetadata } from \"../shared/health-metadata.builder\";\nimport {\n type FitMonitoring,\n type FitMonitoringInfo,\n fitMonitoringInfoSchema,\n fitMonitoringSchema,\n} from \"./fit-monitoring.schema\";\nimport { mapFitMonitoringToKrdDaily } from \"./health-daily.converter\";\n\nconst KRD_VERSION = \"2.0\" as const;\n\nconst parseMonitoringInfo = (\n raw: unknown[],\n logger: Logger\n): FitMonitoringInfo | undefined => {\n for (const entry of raw) {\n const result = fitMonitoringInfoSchema.safeParse(entry);\n if (result.success) return result.data;\n logger.warn(\"Skipping malformed monitoring_info message\", {\n issues: result.error.issues,\n });\n }\n return undefined;\n};\n\nconst parseMonitoring = (raw: unknown[], logger: Logger): FitMonitoring[] => {\n const parsed: FitMonitoring[] = [];\n for (const entry of raw) {\n const result = fitMonitoringSchema.safeParse(entry);\n if (result.success) parsed.push(result.data);\n else\n logger.warn(\"Skipping malformed monitoring message\", {\n issues: result.error.issues,\n });\n }\n return parsed;\n};\n\n/**\n * Maps a FIT monitoring file (file_type monitoringA/B/Daily) to a KRD\n * `daily_wellness`. Steps and active calories are summed across all\n * monitoring messages; resting calories come from monitoring_info.\n */\nexport const convertFitToKrdHealthDaily = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n const fileId = messages[fitMessageKeySchema.enum.fileIdMesgs]?.[0] as\n | Record<string, unknown>\n | undefined;\n const info = parseMonitoringInfo(\n messages[fitMessageKeySchema.enum.monitoringInfoMesgs] ?? [],\n logger\n );\n const monitoring = parseMonitoring(\n messages[fitMessageKeySchema.enum.monitoringMesgs] ?? [],\n logger\n );\n const daily = mapFitMonitoringToKrdDaily(info, monitoring);\n\n return {\n version: KRD_VERSION,\n type: fileTypeSchema.enum.daily_wellness,\n metadata: buildHealthMetadata(fileId),\n extensions: daily ? { health: { daily } } : undefined,\n };\n};\n","import { z } from \"zod\";\n\n/**\n * FIT-side schema for `hrv_status_summary` (mesgNum 370). The\n * @garmin/fitsdk Decoder applies the scale=128 conversion for ms\n * fields automatically.\n */\nexport const fitHrvStatusSummarySchema = z.object({\n timestamp: z.union([z.date(), z.string(), z.number()]),\n weeklyAverage: z.number().optional(),\n lastNightAverage: z.number().optional(),\n lastNight5MinHigh: z.number().optional(),\n baselineLowUpper: z.number().optional(),\n baselineBalancedLower: z.number().optional(),\n baselineBalancedUpper: z.number().optional(),\n status: z.enum([\"none\", \"poor\", \"low\", \"unbalanced\", \"balanced\"]).optional(),\n});\n\n/**\n * FIT-side schema for `hrv_value` (mesgNum 371) — a single 5-min\n * RMSSD sample. KRD's `extensions.health.hrv` is a SUMMARY, not a\n * time-series; per-sample data is not currently preserved in KRD.\n */\nexport const fitHrvValueSchema = z.object({\n timestamp: z.union([z.date(), z.string(), z.number()]),\n value: z.number(),\n});\n\nexport type FitHrvStatusSummary = z.infer<typeof fitHrvStatusSummarySchema>;\nexport type FitHrvValue = z.infer<typeof fitHrvValueSchema>;\n","import type { HrvSummary } from \"@kaiord/core\";\n\nimport type { FitHrvStatusSummary, FitHrvValue } from \"./fit-hrv.schema\";\n\nconst HEALTH_VERSION = \"2.0\";\n\nconst toIsoString = (value: FitHrvStatusSummary[\"timestamp\"]): string => {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"number\") return new Date(value * 1000).toISOString();\n return new Date(value).toISOString();\n};\n\n/**\n * Builds the KRD HRV summary from FIT messages.\n *\n * Preference order: if an `hrv_status_summary` is present, use its\n * `lastNightAverage` as the RMSSD and mark window=\"overnight\"; else\n * use the first `hrv_value` sample with window=\"spot\". Returns\n * `undefined` if neither carries a usable RMSSD.\n */\nexport const mapFitHrvToKrd = (\n summary: FitHrvStatusSummary | undefined,\n firstValue: FitHrvValue | undefined\n): HrvSummary | undefined => {\n if (summary && summary.lastNightAverage !== undefined) {\n return {\n kind: \"hrv\",\n version: HEALTH_VERSION,\n measuredAt: toIsoString(summary.timestamp),\n rMSSD: summary.lastNightAverage,\n measurementWindow: \"overnight\",\n };\n }\n if (firstValue) {\n return {\n kind: \"hrv\",\n version: HEALTH_VERSION,\n measuredAt: toIsoString(firstValue.timestamp),\n rMSSD: firstValue.value,\n measurementWindow: \"spot\",\n };\n }\n return undefined;\n};\n\n/**\n * Inverse mapper — KRD HRV summary → FIT `hrv_status_summary` shape.\n * The output `lastNightAverage` carries the RMSSD; baselines and the\n * status enum default to `\"balanced\"` (KRD does not model them).\n */\nexport const mapKrdHrvToFit = (hrv: HrvSummary): FitHrvStatusSummary => ({\n timestamp: new Date(hrv.measuredAt),\n lastNightAverage: hrv.rMSSD,\n status: \"balanced\",\n});\n","import type { KRD, Logger } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../../shared/types\";\nimport { buildHealthMetadata } from \"../shared/health-metadata.builder\";\nimport {\n type FitHrvStatusSummary,\n fitHrvStatusSummarySchema,\n type FitHrvValue,\n fitHrvValueSchema,\n} from \"./fit-hrv.schema\";\nimport { mapFitHrvToKrd } from \"./health-hrv.converter\";\n\nconst KRD_VERSION = \"2.0\" as const;\n\nconst parseFirstSummary = (\n raw: unknown[],\n logger: Logger\n): FitHrvStatusSummary | undefined => {\n for (const entry of raw) {\n const result = fitHrvStatusSummarySchema.safeParse(entry);\n if (result.success) return result.data;\n logger.warn(\"Skipping malformed hrv_status_summary message\", {\n issues: result.error.issues,\n });\n }\n return undefined;\n};\n\nconst parseFirstValue = (\n raw: unknown[],\n logger: Logger\n): FitHrvValue | undefined => {\n for (const entry of raw) {\n const result = fitHrvValueSchema.safeParse(entry);\n if (result.success) return result.data;\n logger.warn(\"Skipping malformed hrv_value message\", {\n issues: result.error.issues,\n });\n }\n return undefined;\n};\n\n/**\n * Maps a FIT file carrying HRV messages (hrv_status_summary or\n * hrv_value) to a KRD `hrv_summary`. The KRD payload is a single\n * summary, not a time-series — per-sample hrv_value messages beyond\n * the first are not preserved in v2.0.\n */\nexport const convertFitToKrdHealthHrv = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n const fileId = messages[fitMessageKeySchema.enum.fileIdMesgs]?.[0] as\n | Record<string, unknown>\n | undefined;\n const summary = parseFirstSummary(\n messages[fitMessageKeySchema.enum.hrvStatusSummaryMesgs] ?? [],\n logger\n );\n const firstValue = parseFirstValue(\n messages[fitMessageKeySchema.enum.hrvValueMesgs] ?? [],\n logger\n );\n const hrv = mapFitHrvToKrd(summary, firstValue);\n\n return {\n version: KRD_VERSION,\n type: fileTypeSchema.enum.hrv_summary,\n metadata: buildHealthMetadata(fileId),\n extensions: hrv ? { health: { hrv } } : undefined,\n };\n};\n","import { z } from \"zod\";\n\n/**\n * FIT-side schema for a single `sleep_level` message (mesgNum 275).\n *\n * Garmin emits one message per *transition* into a new sleep stage —\n * not one per stage with a duration. KRD sleep stages aggregate\n * consecutive same-level transitions and derive `durationSeconds`\n * from the timestamp delta in the field-level mapper.\n */\nexport const fitSleepLevelSchema = z.object({\n timestamp: z.union([z.date(), z.string(), z.number()]),\n sleepLevel: z.enum([\"awake\", \"light\", \"deep\", \"rem\", \"unmeasurable\"]),\n});\n\nexport type FitSleepLevel = z.infer<typeof fitSleepLevelSchema>;\n","import type { SleepRecord, SleepStage } from \"@kaiord/core\";\n\nimport type { FitSleepLevel } from \"./fit-sleep-level.schema\";\n\nconst HEALTH_VERSION = \"2.0\";\nconst TERMINATOR_LEVEL: SleepStage[\"stage\"] = \"awake\";\n\nconst toIsoString = (value: FitSleepLevel[\"timestamp\"]): string => {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"number\") return new Date(value * 1000).toISOString();\n return new Date(value).toISOString();\n};\n\nconst isKnownSleepStage = (\n level: FitSleepLevel[\"sleepLevel\"]\n): level is SleepStage[\"stage\"] =>\n level === \"awake\" || level === \"light\" || level === \"deep\" || level === \"rem\";\n\n/**\n * Converts an ordered run of FIT `sleep_level` transitions into the KRD\n * sleep payload (sub-schema `extensions.health.sleep`).\n *\n * Convention: N transitions produce N-1 stages. The last transition\n * marks the endTime of the session; its sleepLevel is the terminator\n * (typically `awake`) and contributes no stage of its own.\n *\n * `unmeasurable` transitions are dropped from the stage stream — the\n * resulting stage span is widened to cover them — because KRD's\n * SleepStage enum does not model \"unmeasurable\" as a stage value.\n */\nexport const mapFitSleepLevelsToKrdSleep = (\n fitLevels: FitSleepLevel[]\n): SleepRecord | undefined => {\n if (fitLevels.length < 2) return undefined;\n const sorted = [...fitLevels].sort(\n (a, b) =>\n new Date(toIsoString(a.timestamp)).getTime() -\n new Date(toIsoString(b.timestamp)).getTime()\n );\n const startTime = toIsoString(sorted[0].timestamp);\n const endTime = toIsoString(sorted[sorted.length - 1].timestamp);\n const stages: SleepStage[] = [];\n for (let i = 0; i < sorted.length - 1; i += 1) {\n const current = sorted[i];\n if (!isKnownSleepStage(current.sleepLevel)) continue;\n const startMs = new Date(toIsoString(current.timestamp)).getTime();\n const nextMs = new Date(toIsoString(sorted[i + 1].timestamp)).getTime();\n const durationSeconds = Math.max(0, Math.round((nextMs - startMs) / 1000));\n stages.push({\n stage: current.sleepLevel,\n startTime: toIsoString(current.timestamp),\n durationSeconds,\n });\n }\n const totalDurationSeconds = stages.reduce(\n (sum, stage) => sum + stage.durationSeconds,\n 0\n );\n return {\n kind: \"sleep\",\n version: HEALTH_VERSION,\n startTime,\n endTime,\n totalDurationSeconds,\n stages,\n };\n};\n\n/**\n * Inverse mapper — KRD sleep record → FIT `sleep_level` transitions.\n * Emits one transition per stage plus a terminator transition at\n * `endTime` to preserve the FIT semantics that the reader expects.\n */\nexport const mapKrdSleepToFitSleepLevels = (\n sleep: SleepRecord\n): FitSleepLevel[] => {\n const transitions: FitSleepLevel[] = sleep.stages.map((stage) => ({\n timestamp: new Date(stage.startTime),\n sleepLevel: stage.stage,\n }));\n transitions.push({\n timestamp: new Date(sleep.endTime),\n sleepLevel: TERMINATOR_LEVEL,\n });\n return transitions;\n};\n","import type { KRD, Logger } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../../shared/types\";\nimport { buildHealthMetadata } from \"../shared/health-metadata.builder\";\nimport {\n type FitSleepLevel,\n fitSleepLevelSchema,\n} from \"./fit-sleep-level.schema\";\nimport { mapFitSleepLevelsToKrdSleep } from \"./health-sleep.converter\";\n\nconst KRD_VERSION = \"2.0\" as const;\n\nconst parseSleepLevels = (raw: unknown[], logger: Logger): FitSleepLevel[] => {\n const parsed: FitSleepLevel[] = [];\n for (const entry of raw) {\n const result = fitSleepLevelSchema.safeParse(entry);\n if (result.success) {\n parsed.push(result.data);\n } else {\n logger.warn(\"Skipping malformed sleep_level message\", {\n issues: result.error.issues,\n });\n }\n }\n return parsed;\n};\n\n/**\n * Maps a FIT sleep file (file_type 49 or any file containing\n * `sleep_level` messages) to a KRD `sleep_record` with the sleep\n * payload under `extensions.health.sleep`.\n */\nexport const convertFitToKrdHealthSleep = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n const fileId = messages[fitMessageKeySchema.enum.fileIdMesgs]?.[0] as\n | Record<string, unknown>\n | undefined;\n const rawLevels = messages[fitMessageKeySchema.enum.sleepLevelMesgs] ?? [];\n const fitLevels = parseSleepLevels(rawLevels, logger);\n const sleep = mapFitSleepLevelsToKrdSleep(fitLevels);\n\n return {\n version: KRD_VERSION,\n type: fileTypeSchema.enum.sleep_record,\n metadata: buildHealthMetadata(fileId),\n extensions: sleep ? { health: { sleep } } : undefined,\n };\n};\n","import { z } from \"zod\";\n\n/**\n * FIT-side schema for `stress_level` (mesgNum 227) — a single\n * device-side stress sample. Garmin uses sint16 so it can emit\n * negative sentinels for invalid/not-detected; only values in [0, 100]\n * are valid stress readings.\n */\nexport const fitStressLevelSchema = z.object({\n stressLevelTime: z.union([z.date(), z.string(), z.number()]),\n stressLevelValue: z.number().int(),\n});\n\nexport type FitStressLevel = z.infer<typeof fitStressLevelSchema>;\n","import type { StressEpisode } from \"@kaiord/core\";\n\nimport type { FitStressLevel } from \"./fit-stress.schema\";\n\nconst HEALTH_VERSION = \"2.0\";\nconst MIN_VALID = 0;\nconst MAX_VALID = 100;\nconst MS_PER_S = 1000;\n\nconst toEpochMs = (value: FitStressLevel[\"stressLevelTime\"]): number => {\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"number\") return value * MS_PER_S;\n return new Date(value).getTime();\n};\n\nconst isValid = (sample: FitStressLevel): boolean =>\n sample.stressLevelValue >= MIN_VALID && sample.stressLevelValue <= MAX_VALID;\n\nconst mean = (values: number[]): number =>\n Math.round(values.reduce((s, v) => s + v, 0) / values.length);\n\n/**\n * Aggregates a list of FIT `stress_level` samples into the KRD\n * `extensions.health.stress` episode payload. Garmin emits negative\n * sentinels (-1 / -2) when stress can't be measured; those samples\n * are discarded before aggregation. Returns `undefined` if no valid\n * sample remains.\n */\nexport const mapFitStressToKrd = (\n samples: FitStressLevel[]\n): StressEpisode | undefined => {\n const valid = samples.filter(isValid);\n if (valid.length === 0) return undefined;\n const epochs = valid.map((s) => toEpochMs(s.stressLevelTime));\n const values = valid.map((s) => s.stressLevelValue);\n return {\n kind: \"stress\",\n version: HEALTH_VERSION,\n startTime: new Date(Math.min(...epochs)).toISOString(),\n endTime: new Date(Math.max(...epochs)).toISOString(),\n averageLevel: mean(values),\n peakLevel: Math.max(...values),\n };\n};\n\n/**\n * Inverse mapper — KRD stress episode → minimum-viable FIT\n * `stress_level` pair (one sample at `startTime` with `averageLevel`,\n * one at `endTime` with `peakLevel`). Per-sample data is intrinsically\n * lossy round-tripping a KRD aggregate; the FIT→KRD path will\n * recover startTime, endTime, and peakLevel exactly, but averageLevel\n * becomes `round((average + peak) / 2)`.\n */\nexport const mapKrdStressToFit = (episode: StressEpisode): FitStressLevel[] => [\n {\n stressLevelTime: new Date(episode.startTime),\n stressLevelValue: episode.averageLevel,\n },\n {\n stressLevelTime: new Date(episode.endTime),\n stressLevelValue: episode.peakLevel,\n },\n];\n","import type { KRD, Logger } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../../shared/types\";\nimport { buildHealthMetadata } from \"../shared/health-metadata.builder\";\nimport { type FitStressLevel, fitStressLevelSchema } from \"./fit-stress.schema\";\nimport { mapFitStressToKrd } from \"./health-stress.converter\";\n\nconst KRD_VERSION = \"2.0\" as const;\n\nconst parseSamples = (raw: unknown[], logger: Logger): FitStressLevel[] => {\n const out: FitStressLevel[] = [];\n for (const entry of raw) {\n const result = fitStressLevelSchema.safeParse(entry);\n if (result.success) {\n out.push(result.data);\n continue;\n }\n logger.warn(\"Skipping malformed stress_level message\", {\n issues: result.error.issues,\n });\n }\n return out;\n};\n\n/**\n * Maps a FIT file carrying `stress_level` messages into a KRD\n * `stress_episode`. The KRD payload is a single aggregated window\n * (start/end/avg/peak); per-sample data is not preserved.\n */\nexport const convertFitToKrdHealthStress = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n const fileId = messages[fitMessageKeySchema.enum.fileIdMesgs]?.[0] as\n | Record<string, unknown>\n | undefined;\n const samples = parseSamples(\n messages[fitMessageKeySchema.enum.stressLevelMesgs] ?? [],\n logger\n );\n const stress = mapFitStressToKrd(samples);\n\n return {\n version: KRD_VERSION,\n type: fileTypeSchema.enum.stress_episode,\n metadata: buildHealthMetadata(fileId),\n extensions: stress ? { health: { stress } } : undefined,\n };\n};\n","import { z } from \"zod\";\n\n/**\n * FIT-side schema for a single `weight_scale` message (mesgNum 30).\n *\n * Garmin encodes weight as uint16 with scale 100 (raw 7580 = 75.80 kg).\n * The @garmin/fitsdk Decoder leaves the raw value un-scaled for the\n * special `weight` field type — the field-level mapper divides by 100.\n */\nexport const fitWeightScaleSchema = z.object({\n timestamp: z.union([z.date(), z.string(), z.number()]),\n weight: z.number(),\n percentFat: z.number().optional(),\n percentHydration: z.number().optional(),\n visceralFatMass: z.number().optional(),\n boneMass: z.number().optional(),\n muscleMass: z.number().optional(),\n bmi: z.number().optional(),\n userProfileIndex: z.number().int().optional(),\n});\n\nexport type FitWeightScale = z.infer<typeof fitWeightScaleSchema>;\n","import type { WeightMeasurement } from \"@kaiord/core\";\n\nimport type { FitWeightScale } from \"./fit-weight-scale.schema\";\n\nconst HEALTH_VERSION = \"2.0\";\nconst FIT_WEIGHT_SCALE = 100;\n\nconst toIsoString = (value: FitWeightScale[\"timestamp\"]): string => {\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"number\") return new Date(value * 1000).toISOString();\n return new Date(value).toISOString();\n};\n\n/**\n * Converts a single FIT `weight_scale` message into a KRD weight payload.\n *\n * The FIT field is uint16 scaled by 100 (raw 7580 = 75.80 kg); the\n * Decoder leaves the value un-scaled for the special `weight` field\n * type so we divide here.\n *\n * Returns `undefined` if the raw weight is non-positive (Garmin uses\n * 0xFFFE as a \"calculating\" sentinel and 0xFFFF as invalid).\n */\nexport const mapFitWeightScaleToKrd = (\n fit: FitWeightScale\n): WeightMeasurement | undefined => {\n if (fit.weight <= 0) return undefined;\n return {\n kind: \"weight\",\n version: HEALTH_VERSION,\n measuredAt: toIsoString(fit.timestamp),\n weightKilograms: fit.weight / FIT_WEIGHT_SCALE,\n };\n};\n\n/**\n * Inverse mapper — KRD weight payload → FIT `weight_scale` shape ready\n * for the FIT encoder.\n */\nexport const mapKrdWeightToFit = (\n weight: WeightMeasurement\n): FitWeightScale => ({\n timestamp: new Date(weight.measuredAt),\n weight: Math.round(weight.weightKilograms * FIT_WEIGHT_SCALE),\n});\n","import type { KRD, Logger } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../../shared/types\";\nimport { buildHealthMetadata } from \"../shared/health-metadata.builder\";\nimport {\n type FitWeightScale,\n fitWeightScaleSchema,\n} from \"./fit-weight-scale.schema\";\nimport { mapFitWeightScaleToKrd } from \"./health-weight.converter\";\n\nconst KRD_VERSION = \"2.0\" as const;\n\nconst parseFirstWeight = (\n raw: unknown[],\n logger: Logger\n): FitWeightScale | undefined => {\n for (const entry of raw) {\n const result = fitWeightScaleSchema.safeParse(entry);\n if (result.success) return result.data;\n logger.warn(\"Skipping malformed weight_scale message\", {\n issues: result.error.issues,\n });\n }\n return undefined;\n};\n\n/**\n * Maps a FIT weight file (file_type 9) to a KRD `weight_measurement`\n * with the scalar weight payload under `extensions.health.weight`.\n *\n * When the FIT carries multiple weight_scale messages (multi-user\n * scale), only the first valid one is mapped — the remaining\n * measurements are dropped with a warning. Per-user fan-out is out\n * of scope for the v2.0 single-KRD-per-file contract.\n */\nexport const convertFitToKrdHealthWeight = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n const fileId = messages[fitMessageKeySchema.enum.fileIdMesgs]?.[0] as\n | Record<string, unknown>\n | undefined;\n const rawWeights = messages[fitMessageKeySchema.enum.weightScaleMesgs] ?? [];\n if (rawWeights.length > 1) {\n logger.warn(\"Multiple weight_scale messages — keeping the first only\", {\n count: rawWeights.length,\n });\n }\n const fitWeight = parseFirstWeight(rawWeights, logger);\n const weight = fitWeight ? mapFitWeightScaleToKrd(fitWeight) : undefined;\n\n return {\n version: KRD_VERSION,\n type: fileTypeSchema.enum.weight_measurement,\n metadata: buildHealthMetadata(fileId),\n extensions: weight ? { health: { weight } } : undefined,\n };\n};\n","import type { KRDEvent } from \"@kaiord/core\";\n\nimport type { FitEvent, FitEventType } from \"../schemas/fit-event\";\n\nexport const FIT_EVENT_TO_KRD_TYPE: Record<FitEvent, KRDEvent[\"eventType\"]> = {\n timer: \"event_timer\",\n workout: \"event_start\",\n workoutStep: \"event_workout_step_change\",\n powerDown: \"event_stop\",\n powerUp: \"event_start\",\n offCourse: \"event_marker\",\n session: \"event_session_start\",\n lap: \"event_lap\",\n coursePoint: \"event_marker\",\n battery: \"event_marker\",\n virtualPartnerPace: \"event_marker\",\n hrHighAlert: \"event_marker\",\n hrLowAlert: \"event_marker\",\n speedHighAlert: \"event_marker\",\n speedLowAlert: \"event_marker\",\n cadHighAlert: \"event_marker\",\n cadLowAlert: \"event_marker\",\n powerHighAlert: \"event_marker\",\n powerLowAlert: \"event_marker\",\n recoveryHr: \"event_marker\",\n batteryLow: \"event_marker\",\n timeDurationAlert: \"event_marker\",\n distanceDurationAlert: \"event_marker\",\n calorieDurationAlert: \"event_marker\",\n activity: \"event_activity_start\",\n fitnessEquipment: \"event_marker\",\n length: \"event_lap\",\n userMarker: \"event_marker\",\n sportPoint: \"event_marker\",\n calibration: \"event_marker\",\n frontGearChange: \"event_marker\",\n rearGearChange: \"event_marker\",\n riderPositionChange: \"event_marker\",\n elevHighAlert: \"event_marker\",\n elevLowAlert: \"event_marker\",\n};\n\nexport const KRD_TYPE_TO_FIT_EVENT: Record<KRDEvent[\"eventType\"], FitEvent> = {\n event_start: \"timer\",\n event_stop: \"timer\",\n event_pause: \"timer\",\n event_resume: \"timer\",\n event_lap: \"lap\",\n event_marker: \"userMarker\",\n event_timer: \"timer\",\n event_workout_step_change: \"workoutStep\",\n event_session_start: \"session\",\n event_activity_start: \"activity\",\n};\n\nexport const KRD_TYPE_TO_FIT_EVENT_TYPE: Record<\n KRDEvent[\"eventType\"],\n FitEventType\n> = {\n event_start: \"start\",\n event_stop: \"stop\",\n event_pause: \"stopDisable\",\n event_resume: \"start\",\n event_lap: \"marker\",\n event_marker: \"marker\",\n event_timer: \"start\",\n event_workout_step_change: \"marker\",\n event_session_start: \"start\",\n event_activity_start: \"start\",\n};\n","import type { KRDEvent } from \"@kaiord/core\";\n\nimport type {\n FitEvent,\n FitEventMessage,\n FitEventType,\n} from \"../schemas/fit-event\";\nimport {\n FIT_EVENT_TO_KRD_TYPE,\n KRD_TYPE_TO_FIT_EVENT,\n KRD_TYPE_TO_FIT_EVENT_TYPE,\n} from \"./event-type-maps\";\n\nconst mapEventTypeToKrd = (\n fitEvent: FitEvent,\n fitEventType: FitEventType\n): KRDEvent[\"eventType\"] => {\n if (fitEvent === \"timer\") {\n switch (fitEventType) {\n case \"start\":\n return \"event_start\";\n case \"stop\":\n return \"event_stop\";\n case \"stopDisable\":\n case \"stopDisableAll\":\n return \"event_pause\";\n default:\n return \"event_timer\";\n }\n }\n return FIT_EVENT_TO_KRD_TYPE[fitEvent] ?? \"event_marker\";\n};\n\n/** Maps FIT EVENT to KRD event. */\nexport const mapFitEventToKrd = (fit: FitEventMessage): KRDEvent => ({\n timestamp: new Date(fit.timestamp * 1000).toISOString(),\n eventType: mapEventTypeToKrd(fit.event, fit.eventType),\n eventGroup: fit.eventGroup,\n data: fit.data,\n});\n\n/** Maps KRD event to FIT EVENT. */\nexport const mapKrdEventToFit = (krd: KRDEvent): Partial<FitEventMessage> => ({\n timestamp: Math.floor(new Date(krd.timestamp).getTime() / 1000),\n event: KRD_TYPE_TO_FIT_EVENT[krd.eventType] ?? \"userMarker\",\n eventType: KRD_TYPE_TO_FIT_EVENT_TYPE[krd.eventType] ?? \"marker\",\n eventGroup: krd.eventGroup,\n data: krd.data,\n});\n","import { z } from \"zod\";\n\n/**\n * FIT event types (what kind of event occurred).\n */\nexport const fitEventSchema = z.enum([\n \"timer\",\n \"workout\",\n \"workoutStep\",\n \"powerDown\",\n \"powerUp\",\n \"offCourse\",\n \"session\",\n \"lap\",\n \"coursePoint\",\n \"battery\",\n \"virtualPartnerPace\",\n \"hrHighAlert\",\n \"hrLowAlert\",\n \"speedHighAlert\",\n \"speedLowAlert\",\n \"cadHighAlert\",\n \"cadLowAlert\",\n \"powerHighAlert\",\n \"powerLowAlert\",\n \"recoveryHr\",\n \"batteryLow\",\n \"timeDurationAlert\",\n \"distanceDurationAlert\",\n \"calorieDurationAlert\",\n \"activity\",\n \"fitnessEquipment\",\n \"length\",\n \"userMarker\",\n \"sportPoint\",\n \"calibration\",\n \"frontGearChange\",\n \"rearGearChange\",\n \"riderPositionChange\",\n \"elevHighAlert\",\n \"elevLowAlert\",\n]);\n\nexport type FitEvent = z.infer<typeof fitEventSchema>;\n\n/**\n * FIT event type (start, stop, marker, etc.).\n */\nexport const fitEventTypeSchema = z.enum([\n \"start\",\n \"stop\",\n \"consecutiveDepreciated\",\n \"marker\",\n \"stopAll\",\n \"beginDepreciated\",\n \"endDepreciated\",\n \"endAllDepreciated\",\n \"stopDisable\",\n \"stopDisableAll\",\n]);\n\nexport type FitEventType = z.infer<typeof fitEventTypeSchema>;\n\n/**\n * FIT EVENT message schema (Message ID: 21).\n *\n * Captures workout events like start, stop, pause, markers.\n */\nexport const fitEventMessageSchema = z.object({\n timestamp: z.number(),\n event: fitEventSchema,\n eventType: fitEventTypeSchema,\n eventGroup: z.number().optional(),\n data: z.number().optional(),\n data16: z.number().optional(),\n});\n\nexport type FitEventMessage = z.infer<typeof fitEventMessageSchema>;\n","import type { KRDEvent } from \"@kaiord/core\";\n\nimport {\n type FitEventMessage,\n fitEventMessageSchema,\n} from \"../schemas/fit-event\";\nimport { mapFitEventToKrd } from \"./event.mapper\";\n\n/**\n * Converts a FIT EVENT message to KRD event format.\n *\n * @param data - Raw FIT EVENT message data\n * @returns KRD event object\n * @throws Error if FIT data is invalid\n */\nexport const convertFitToKrdEvent = (\n data: Record<string, unknown>\n): KRDEvent => {\n const fitEvent = fitEventMessageSchema.parse(data) as FitEventMessage;\n return mapFitEventToKrd(fitEvent);\n};\n\n/**\n * Batch converts FIT EVENT messages to KRD events.\n *\n * @param events - Array of raw FIT EVENT message data\n * @returns Array of KRD event objects\n */\nexport const convertFitToKrdEvents = (\n events: Record<string, unknown>[]\n): KRDEvent[] => {\n return events.map(convertFitToKrdEvent);\n};\n","const extractDeveloperFields = (\n message: Record<string, unknown>\n): Array<Record<string, unknown>> => {\n const devFields: Array<Record<string, unknown>> = [];\n\n for (const [key, value] of Object.entries(message)) {\n if (key.startsWith(\"developer_\") || key.includes(\"DeveloperField\")) {\n devFields.push({\n fieldName: key,\n value,\n });\n }\n }\n\n return devFields;\n};\n\nexport const extractFieldsFromMessageArray = (\n messages: unknown[]\n): Array<Record<string, unknown>> => {\n const developerFields: Array<Record<string, unknown>> = [];\n for (const message of messages) {\n if (message && typeof message === \"object\") {\n const devFields = extractDeveloperFields(\n message as Record<string, unknown>\n );\n if (devFields.length > 0) {\n developerFields.push(...devFields);\n }\n }\n }\n return developerFields;\n};\n","import type { Logger } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../shared/types\";\nimport { extractFieldsFromMessageArray } from \"./developer-fields.extractor\";\n\nexport const extractFitExtensions = (\n messages: FitMessages,\n logger: Logger\n): Record<string, unknown> => {\n logger.debug(\"Extracting FIT extensions\");\n\n const unknownMessages = extractUnknownMessages(messages, logger);\n const developerFields = extractAllDeveloperFields(messages);\n\n return buildExtensions(unknownMessages, developerFields, logger);\n};\n\nconst extractUnknownMessages = (\n messages: FitMessages,\n logger: Logger\n): Record<string, Array<Record<string, unknown>>> => {\n const knownMessageKeys = new Set<string>([\n fitMessageKeySchema.enum.fileIdMesgs,\n fitMessageKeySchema.enum.workoutMesgs,\n fitMessageKeySchema.enum.workoutStepMesgs,\n ]);\n\n const unknownMessages: Record<string, Array<Record<string, unknown>>> = {};\n\n for (const [key, value] of Object.entries(messages)) {\n if (!knownMessageKeys.has(key) && value && Array.isArray(value)) {\n logger.debug(\"Found unknown message type\", { messageType: key });\n unknownMessages[key] = value;\n }\n }\n\n return unknownMessages;\n};\n\nconst extractAllDeveloperFields = (\n messages: FitMessages\n): Array<Record<string, unknown>> => {\n const developerFields: Array<Record<string, unknown>> = [];\n\n for (const value of Object.values(messages)) {\n if (value && Array.isArray(value)) {\n developerFields.push(...extractFieldsFromMessageArray(value));\n }\n }\n\n return developerFields;\n};\n\nconst buildExtensions = (\n unknownMessages: Record<string, Array<Record<string, unknown>>>,\n developerFields: Array<Record<string, unknown>>,\n logger: Logger\n): Record<string, unknown> => {\n const extensions: Record<string, unknown> = {};\n\n if (developerFields.length > 0) {\n logger.info(\"Preserved developer fields\", {\n count: developerFields.length,\n });\n extensions.developerFields = developerFields;\n }\n\n if (Object.keys(unknownMessages).length > 0) {\n logger.info(\"Preserved unknown message types\", {\n types: Object.keys(unknownMessages),\n });\n extensions.unknownMessages = unknownMessages;\n }\n\n return extensions;\n};\n","import { z } from \"zod\";\n\n/**\n * FIT lap trigger types (what caused the lap to be recorded).\n */\nexport const fitLapTriggerSchema = z.enum([\n \"manual\",\n \"time\",\n \"distance\",\n \"positionStart\",\n \"positionLap\",\n \"positionWaypoint\",\n \"positionMarked\",\n \"sessionEnd\",\n \"fitnessEquipment\",\n]);\n\nexport type FitLapTrigger = z.infer<typeof fitLapTriggerSchema>;\n","import { z } from \"zod\";\n\nexport const fitSportSchema = z.enum([\n \"cycling\",\n \"running\",\n \"swimming\",\n \"generic\",\n]);\n\nexport type FitSport = z.infer<typeof fitSportSchema>;\n","import { z } from \"zod\";\n\nimport { fitLapTriggerSchema } from \"./fit-lap-trigger\";\nimport { fitSportSchema } from \"./fit-sport\";\nimport { fitSubSportSchema } from \"./fit-sub-sport\";\n\n/**\n * FIT LAP message schema (Message ID: 19).\n *\n * Contains per-lap/interval statistics for structured workouts.\n */\nexport const fitLapSchema = z.object({\n // Identifiers\n messageIndex: z.number().optional(),\n timestamp: z.number(),\n\n // Timing\n startTime: z.number(),\n totalElapsedTime: z.number(),\n totalTimerTime: z.number(),\n\n // Distance\n totalDistance: z.number().optional(),\n\n // Speed (enhanced values preferred when available)\n avgSpeed: z.number().optional(),\n maxSpeed: z.number().optional(),\n enhancedAvgSpeed: z.number().optional(),\n enhancedMaxSpeed: z.number().optional(),\n\n // Heart rate\n avgHeartRate: z.number().optional(),\n maxHeartRate: z.number().optional(),\n\n // Cadence\n avgCadence: z.number().optional(),\n maxCadence: z.number().optional(),\n\n // Power\n avgPower: z.number().optional(),\n maxPower: z.number().optional(),\n normalizedPower: z.number().optional(),\n\n // Elevation\n totalAscent: z.number().optional(),\n totalDescent: z.number().optional(),\n\n // Calories\n totalCalories: z.number().optional(),\n\n // Classification\n lapTrigger: fitLapTriggerSchema.optional(),\n sport: fitSportSchema.optional(),\n subSport: fitSubSportSchema.optional(),\n\n // Swimming\n numLengths: z.number().optional(),\n swimStroke: z.number().optional(),\n\n // Workout reference\n wktStepIndex: z.number().optional(),\n});\n\nexport type FitLap = z.infer<typeof fitLapSchema>;\n","import type { KRDLapTrigger } from \"@kaiord/core\";\n\nimport type { FitLapTrigger } from \"../schemas/fit-lap-trigger\";\n\n/**\n * Maps FIT lap trigger to KRD lap trigger.\n * Position-based triggers are consolidated into \"position\".\n */\nexport const mapFitLapTriggerToKrd = (fit: FitLapTrigger): KRDLapTrigger => {\n switch (fit) {\n case \"manual\":\n return \"manual\";\n case \"time\":\n return \"time\";\n case \"distance\":\n return \"distance\";\n case \"positionStart\":\n case \"positionLap\":\n case \"positionWaypoint\":\n case \"positionMarked\":\n return \"position\";\n case \"sessionEnd\":\n return \"session_end\";\n case \"fitnessEquipment\":\n return \"fitness_equipment\";\n }\n};\n\n/**\n * Maps KRD lap trigger to FIT lap trigger.\n * Position defaults to positionLap.\n */\nexport const mapKrdLapTriggerToFit = (krd: KRDLapTrigger): FitLapTrigger => {\n switch (krd) {\n case \"manual\":\n return \"manual\";\n case \"time\":\n return \"time\";\n case \"distance\":\n return \"distance\";\n case \"position\":\n return \"positionLap\";\n case \"session_end\":\n return \"sessionEnd\";\n case \"fitness_equipment\":\n return \"fitnessEquipment\";\n }\n};\n","import type { KRDLap } from \"@kaiord/core\";\nimport { FIT_TO_SWIM_STROKE } from \"@kaiord/core\";\n\nimport type { FitLap } from \"../schemas/fit-lap\";\nimport { mapSubSportToKrd } from \"../sub-sport/sub-sport\";\nimport { mapFitLapTriggerToKrd } from \"./lap-trigger.mapper\";\n\n/**\n * Maps FIT LAP fields to KRD lap fields.\n * Thin translation layer - no complex logic.\n */\nexport const mapFitLapToKrd = (fit: FitLap): KRDLap => ({\n // Timing - convert ms to seconds\n startTime: new Date(fit.startTime * 1000).toISOString(),\n totalElapsedTime: fit.totalElapsedTime / 1000,\n totalTimerTime: fit.totalTimerTime / 1000,\n\n // Distance\n totalDistance: fit.totalDistance,\n\n // Heart rate\n avgHeartRate: fit.avgHeartRate,\n maxHeartRate: fit.maxHeartRate,\n\n // Cadence\n avgCadence: fit.avgCadence,\n maxCadence: fit.maxCadence,\n\n // Power\n avgPower: fit.avgPower,\n maxPower: fit.maxPower,\n normalizedPower: fit.normalizedPower,\n\n // Speed - prefer enhanced values\n avgSpeed: fit.enhancedAvgSpeed ?? fit.avgSpeed,\n maxSpeed: fit.enhancedMaxSpeed ?? fit.maxSpeed,\n\n // Elevation\n totalAscent: fit.totalAscent,\n totalDescent: fit.totalDescent,\n\n // Calories\n totalCalories: fit.totalCalories,\n\n // Classification\n trigger: fit.lapTrigger ? mapFitLapTriggerToKrd(fit.lapTrigger) : undefined,\n sport: fit.sport,\n subSport: fit.subSport ? mapSubSportToKrd(fit.subSport) : undefined,\n\n // Workout reference\n workoutStepIndex: fit.wktStepIndex,\n\n // Swimming\n numLengths: fit.numLengths,\n swimStroke:\n fit.swimStroke !== undefined\n ? FIT_TO_SWIM_STROKE[fit.swimStroke]\n : undefined,\n});\n","import type { KRDLap } from \"@kaiord/core\";\n\nimport type { FitLap } from \"../schemas/fit-lap\";\nimport { fitLapSchema } from \"../schemas/fit-lap\";\nimport { mapFitLapToKrd } from \"./fit-to-krd-lap.mapper\";\n\n/**\n * Converts a FIT LAP message to KRD lap format.\n *\n * @param data - Raw FIT LAP message data\n * @returns KRD lap object\n * @throws Error if FIT data is invalid\n */\nexport const convertFitToKrdLap = (data: Record<string, unknown>): KRDLap => {\n const fitLap = fitLapSchema.parse(data) as FitLap;\n return mapFitLapToKrd(fitLap);\n};\n\n/**\n * Batch converts FIT LAP messages to KRD laps.\n *\n * @param laps - Array of raw FIT LAP message data\n * @returns Array of KRD lap objects\n */\nexport const convertFitToKrdLaps = (\n laps: Record<string, unknown>[]\n): KRDLap[] => {\n return laps.map(convertFitToKrdLap);\n};\n","import { z } from \"zod\";\n\n/**\n * FIT RECORD message schema (Message ID: 20).\n *\n * Contains time-series data points (typically 1 per second).\n * Coordinates are in semicircles (signed 32-bit integer).\n */\nexport const fitRecordSchema = z.object({\n timestamp: z.number(),\n positionLat: z.number().optional(),\n positionLong: z.number().optional(),\n altitude: z.number().optional(),\n enhancedAltitude: z.number().optional(),\n speed: z.number().optional(),\n enhancedSpeed: z.number().optional(),\n distance: z.number().optional(),\n heartRate: z.number().optional(),\n cadence: z.number().optional(),\n fractionalCadence: z.number().optional(),\n power: z.number().optional(),\n temperature: z.number().optional(),\n verticalOscillation: z.number().optional(),\n stanceTime: z.number().optional(),\n stanceTimePercent: z.number().optional(),\n stepLength: z.number().optional(),\n compressedTimestamp: z.number().optional(),\n});\n\nexport type FitRecord = z.infer<typeof fitRecordSchema>;\n","import type { KRDRecord } from \"@kaiord/core\";\n\nimport type { FitRecord } from \"../schemas/fit-record\";\nimport { semicirclesToDegrees } from \"../shared/coordinate.converter\";\n\nconst mapFitPosition = (\n fit: FitRecord\n): { lat: number; lon: number } | undefined => {\n if (fit.positionLat !== undefined && fit.positionLong !== undefined) {\n return {\n lat: semicirclesToDegrees(fit.positionLat),\n lon: semicirclesToDegrees(fit.positionLong),\n };\n }\n return undefined;\n};\n\nconst mapFitAltitudeAndSpeed = (fit: FitRecord, record: KRDRecord): void => {\n if (fit.enhancedAltitude !== undefined) {\n record.altitude = fit.enhancedAltitude;\n } else if (fit.altitude !== undefined) {\n record.altitude = fit.altitude;\n }\n if (fit.enhancedSpeed !== undefined) {\n record.speed = fit.enhancedSpeed;\n } else if (fit.speed !== undefined) {\n record.speed = fit.speed;\n }\n};\n\nconst mapFitCoreFields = (fit: FitRecord, record: KRDRecord): void => {\n if (fit.distance !== undefined) record.distance = fit.distance;\n if (fit.heartRate !== undefined) record.heartRate = fit.heartRate;\n if (fit.power !== undefined) record.power = fit.power;\n if (fit.temperature !== undefined) record.temperature = fit.temperature;\n if (fit.cadence !== undefined) {\n record.cadence = fit.cadence + (fit.fractionalCadence ?? 0);\n }\n};\n\nconst mapFitRunningDynamics = (fit: FitRecord, record: KRDRecord): void => {\n if (fit.verticalOscillation !== undefined) {\n record.verticalOscillation = fit.verticalOscillation;\n }\n if (fit.stanceTime !== undefined) record.stanceTime = fit.stanceTime;\n if (fit.stepLength !== undefined) record.stepLength = fit.stepLength;\n};\n\n/**\n * Maps FIT RECORD fields to KRD record fields.\n * Thin translation layer - no complex logic.\n */\nexport const mapFitRecordToKrd = (fit: FitRecord): KRDRecord => {\n const record: KRDRecord = {\n timestamp: new Date(fit.timestamp * 1000).toISOString(),\n };\n\n const position = mapFitPosition(fit);\n if (position) record.position = position;\n mapFitAltitudeAndSpeed(fit, record);\n mapFitCoreFields(fit, record);\n mapFitRunningDynamics(fit, record);\n\n return record;\n};\n","import type { KRDRecord } from \"@kaiord/core\";\n\nimport { type FitRecord, fitRecordSchema } from \"../schemas/fit-record\";\nimport { validateCoordinates } from \"../shared/coordinate.converter\";\nimport { mapFitRecordToKrd } from \"./record.mapper\";\n\n/**\n * Converts a FIT RECORD message to KRD record format.\n *\n * @param data - Raw FIT RECORD message data\n * @returns KRD record object\n * @throws Error if FIT data is invalid or coordinates out of range\n */\nexport const convertFitToKrdRecord = (\n data: Record<string, unknown>\n): KRDRecord => {\n const fitRecord = fitRecordSchema.parse(data) as FitRecord;\n\n // Validate coordinates if present - both must be present or neither\n const hasLat = fitRecord.positionLat !== undefined;\n const hasLon = fitRecord.positionLong !== undefined;\n\n if (hasLat !== hasLon) {\n throw new Error(\"Partial coordinates: both lat and lon must be present\");\n }\n\n if (hasLat && hasLon) {\n if (!validateCoordinates(fitRecord.positionLat!, fitRecord.positionLong!)) {\n throw new Error(\"Invalid coordinates: out of range\");\n }\n }\n\n return mapFitRecordToKrd(fitRecord);\n};\n\n/**\n * Batch converts FIT RECORD messages to KRD records.\n * Optimized for processing large numbers of records.\n *\n * @param records - Array of raw FIT RECORD message data\n * @returns Array of KRD record objects\n */\nexport const convertFitToKrdRecords = (\n records: Record<string, unknown>[]\n): KRDRecord[] => {\n return records.map(convertFitToKrdRecord);\n};\n","import { z } from \"zod\";\n\nimport { fitSportSchema } from \"./fit-sport\";\nimport { fitSubSportSchema } from \"./fit-sub-sport\";\n\n/**\n * FIT SESSION message schema (Message ID: 18).\n *\n * Contains aggregate statistics for the entire workout/activity.\n */\nexport const fitSessionSchema = z.object({\n timestamp: z.number(),\n startTime: z.number(),\n totalElapsedTime: z.number(),\n totalTimerTime: z.number(),\n totalDistance: z.number().optional(),\n totalCalories: z.number().optional(),\n avgSpeed: z.number().optional(),\n maxSpeed: z.number().optional(),\n enhancedAvgSpeed: z.number().optional(),\n enhancedMaxSpeed: z.number().optional(),\n avgHeartRate: z.number().optional(),\n maxHeartRate: z.number().optional(),\n avgCadence: z.number().optional(),\n maxCadence: z.number().optional(),\n avgPower: z.number().optional(),\n maxPower: z.number().optional(),\n normalizedPower: z.number().optional(),\n trainingStressScore: z.number().optional(),\n intensityFactor: z.number().optional(),\n totalAscent: z.number().optional(),\n totalDescent: z.number().optional(),\n sport: fitSportSchema,\n subSport: fitSubSportSchema.optional(),\n numLaps: z.number().optional(),\n firstLapIndex: z.number().optional(),\n});\n\nexport type FitSession = z.infer<typeof fitSessionSchema>;\n","import type { KRDSession } from \"@kaiord/core\";\n\nimport type { FitSession } from \"../schemas/fit-session\";\nimport { mapSubSportToFit, mapSubSportToKrd } from \"../sub-sport/sub-sport\";\n\n/**\n * Maps FIT SESSION fields to KRD session fields.\n * Thin translation layer - no complex logic.\n */\nexport const mapFitSessionToKrd = (fit: FitSession): KRDSession => ({\n startTime: new Date(fit.startTime * 1000).toISOString(),\n totalElapsedTime: fit.totalElapsedTime / 1000,\n totalTimerTime:\n fit.totalTimerTime !== undefined ? fit.totalTimerTime / 1000 : undefined,\n totalDistance: fit.totalDistance,\n sport: String(fit.sport),\n subSport: fit.subSport ? mapSubSportToKrd(fit.subSport) : undefined,\n avgHeartRate: fit.avgHeartRate,\n maxHeartRate: fit.maxHeartRate,\n avgCadence: fit.avgCadence,\n maxCadence: fit.maxCadence,\n avgPower: fit.avgPower,\n maxPower: fit.maxPower,\n normalizedPower: fit.normalizedPower,\n trainingStressScore: fit.trainingStressScore,\n intensityFactor: fit.intensityFactor,\n totalCalories: fit.totalCalories,\n totalAscent: fit.totalAscent,\n totalDescent: fit.totalDescent,\n avgSpeed: fit.enhancedAvgSpeed ?? fit.avgSpeed,\n maxSpeed: fit.enhancedMaxSpeed ?? fit.maxSpeed,\n});\n\n/**\n * Maps KRD session fields to FIT SESSION fields.\n * Thin translation layer - no complex logic.\n */\nexport const mapKrdSessionToFit = (krd: KRDSession): Partial<FitSession> => {\n const startTimeSeconds = Math.floor(new Date(krd.startTime).getTime() / 1000);\n const elapsedTimeMs = krd.totalElapsedTime * 1000;\n // Preserve zero totalTimerTime, default to elapsed time if undefined\n const timerTimeMs =\n krd.totalTimerTime !== undefined\n ? krd.totalTimerTime * 1000\n : elapsedTimeMs;\n\n return {\n timestamp: startTimeSeconds + Math.floor(krd.totalElapsedTime),\n startTime: startTimeSeconds,\n totalElapsedTime: elapsedTimeMs,\n totalTimerTime: timerTimeMs,\n totalDistance: krd.totalDistance,\n sport: krd.sport as FitSession[\"sport\"],\n subSport: krd.subSport ? mapSubSportToFit(krd.subSport) : undefined,\n avgHeartRate: krd.avgHeartRate,\n maxHeartRate: krd.maxHeartRate,\n avgCadence: krd.avgCadence,\n maxCadence: krd.maxCadence,\n avgPower: krd.avgPower,\n maxPower: krd.maxPower,\n normalizedPower: krd.normalizedPower,\n trainingStressScore: krd.trainingStressScore,\n intensityFactor: krd.intensityFactor,\n totalCalories: krd.totalCalories,\n totalAscent: krd.totalAscent,\n totalDescent: krd.totalDescent,\n avgSpeed: krd.avgSpeed,\n maxSpeed: krd.maxSpeed,\n };\n};\n","import type { KRDSession } from \"@kaiord/core\";\n\nimport { type FitSession, fitSessionSchema } from \"../schemas/fit-session\";\nimport { mapFitSessionToKrd } from \"./session.mapper\";\n\n/**\n * Converts a FIT SESSION message to KRD session format.\n *\n * @param data - Raw FIT SESSION message data\n * @returns KRD session object\n * @throws Error if FIT data is invalid\n */\nexport const convertFitToKrdSession = (\n data: Record<string, unknown>\n): KRDSession => {\n const fitSession = fitSessionSchema.parse(data) as FitSession;\n return mapFitSessionToKrd(fitSession);\n};\n","import type { Logger } from \"@kaiord/core\";\nimport type { KRD } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { convertFitToKrdEvents } from \"../event\";\nimport { extractFitExtensions } from \"../extensions/extensions.extractor\";\nimport { convertFitToKrdLaps } from \"../lap\";\nimport { convertFitToKrdRecords } from \"../record\";\nimport { fitMessageKeySchema } from \"../schemas/fit-message-keys\";\nimport { convertFitToKrdSession } from \"../session\";\nimport type { FitMessages } from \"../shared/types\";\n\nconst KRD_VERSION = \"1.0\" as const;\n\n/**\n * Converts FIT timeCreated to ISO string, handling Date objects and numbers\n */\nconst convertTimeCreated = (timeCreated: unknown): string => {\n if (timeCreated instanceof Date) return timeCreated.toISOString();\n if (typeof timeCreated === \"number\")\n return new Date(timeCreated * 1000).toISOString();\n return new Date().toISOString();\n};\n\nconst buildKrdMetadata = (\n fileId: Record<string, unknown> | undefined,\n session: ReturnType<typeof convertFitToKrdSession> | undefined\n) => ({\n created: convertTimeCreated(fileId ? fileId.timeCreated : undefined),\n sport: (session ? session.sport : undefined) ?? \"other\",\n subSport: session ? session.subSport : undefined,\n});\n\nconst toOptionalArray = <T>(items: T[]): T[] | undefined =>\n items.length > 0 ? items : undefined;\n\nconst toOptionalSingle = <T>(item: T | undefined): T[] | undefined =>\n item !== undefined ? [item] : undefined;\n\n/**\n * Maps activity file to KRD format.\n */\nexport const mapActivityFileToKRD = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n const fileId = messages[fitMessageKeySchema.enum.fileIdMesgs]?.[0];\n const sessionMsgs = messages[fitMessageKeySchema.enum.sessionMesgs] || [];\n const recordMsgs = messages[fitMessageKeySchema.enum.recordMesgs] || [];\n const eventMsgs = messages[fitMessageKeySchema.enum.eventMesgs] || [];\n const lapMsgs = messages[fitMessageKeySchema.enum.lapMesgs] || [];\n\n logger.debug(\"Mapping activity file\", {\n sessions: sessionMsgs.length,\n records: recordMsgs.length,\n events: eventMsgs.length,\n laps: lapMsgs.length,\n });\n\n const session =\n sessionMsgs.length > 0 ? convertFitToKrdSession(sessionMsgs[0]) : undefined;\n const records = convertFitToKrdRecords(recordMsgs);\n const events = convertFitToKrdEvents(eventMsgs);\n const laps = convertFitToKrdLaps(lapMsgs);\n const fitExtensions = extractFitExtensions(messages, logger);\n\n return {\n version: KRD_VERSION,\n type: fileTypeSchema.enum.recorded_activity,\n metadata: buildKrdMetadata(\n fileId as Record<string, unknown> | undefined,\n session\n ),\n sessions: toOptionalSingle(session),\n laps: toOptionalArray(laps),\n records: toOptionalArray(records),\n events: toOptionalArray(events),\n extensions: { fit: fitExtensions },\n };\n};\n","import { type FileType, fileTypeSchema } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../shared/types\";\n\n/**\n * Ordered list of (message-key, file-type) pairs that identify a\n * health FIT file by the presence of its primary message stream. The\n * order encodes priority — the first detector that matches wins, so\n * a file carrying both `sleepLevelMesgs` and `monitoringMesgs` is\n * classified as `sleep_record`.\n *\n * Adding a new health category requires appending one row here plus\n * a switch arm in `mapMessagesToKRD` / `createFitMessages`.\n */\nconst HEALTH_DETECTORS: ReadonlyArray<readonly [string, FileType]> = [\n [\"sleepLevelMesgs\", fileTypeSchema.enum.sleep_record],\n [\"bodyCompositionMesgs\", fileTypeSchema.enum.body_composition],\n [\"weightScaleMesgs\", fileTypeSchema.enum.weight_measurement],\n [\"hrvStatusSummaryMesgs\", fileTypeSchema.enum.hrv_summary],\n [\"hrvValueMesgs\", fileTypeSchema.enum.hrv_summary],\n [\"monitoringMesgs\", fileTypeSchema.enum.daily_wellness],\n [\"stressLevelMesgs\", fileTypeSchema.enum.stress_episode],\n];\n\nexport const detectFileType = (messages: FitMessages): FileType => {\n for (const [key, type] of HEALTH_DETECTORS) {\n const mesgs = messages[key];\n if (mesgs && mesgs.length > 0) return type;\n }\n\n const workoutMsgs = messages[fitMessageKeySchema.enum.workoutMesgs];\n if (workoutMsgs && workoutMsgs.length > 0)\n return fileTypeSchema.enum.structured_workout;\n\n const sessionMsgs = messages[fitMessageKeySchema.enum.sessionMesgs];\n const recordMsgs = messages[fitMessageKeySchema.enum.recordMesgs];\n if (\n (sessionMsgs && sessionMsgs.length > 0) ||\n (recordMsgs && recordMsgs.length > 0)\n ) {\n return fileTypeSchema.enum.recorded_activity;\n }\n\n return fileTypeSchema.enum.structured_workout;\n};\n","import type { Sport } from \"@kaiord/core\";\nimport { sportSchema } from \"@kaiord/core\";\n\n/**\n * Default values for FIT file generation and mapping\n */\nexport const DEFAULT_MANUFACTURER = \"development\" as const;\nexport const DEFAULT_SPORT = sportSchema.enum.cycling;\n\n/**\n * Maps FIT sport type to KRD sport type\n * Returns DEFAULT_SPORT if fitSport is undefined\n */\nexport const mapSportType = (fitSport: string | undefined): Sport => {\n if (!fitSport) {\n return DEFAULT_SPORT;\n }\n const lower = fitSport.toLowerCase();\n const result = sportSchema.safeParse(lower);\n return result.success ? result.data : DEFAULT_SPORT;\n};\n","import type { KRDMetadata } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\n\nimport { mapSportType } from \"../shared/type-guards\";\nimport type { FitFileId, FitWorkoutMessage } from \"../shared/types\";\nexport const mapMetadata = (\n fileId: FitFileId | undefined,\n workoutMsg: FitWorkoutMessage | undefined,\n logger: Logger\n): KRDMetadata => {\n logger.debug(\"Mapping metadata from FIT messages\");\n\n const sport = mapSportType(workoutMsg?.sport);\n const created = mapCreatedTimestamp(fileId);\n\n return {\n created,\n manufacturer: fileId?.manufacturer,\n product: fileId?.garminProduct || fileId?.product?.toString(),\n serialNumber: fileId?.serialNumber?.toString(),\n sport,\n };\n};\n\nconst mapCreatedTimestamp = (fileId: FitFileId | undefined): string => {\n if (!fileId?.timeCreated) {\n return new Date().toISOString();\n }\n\n if (typeof fileId.timeCreated === \"string\") {\n return fileId.timeCreated;\n }\n\n if (fileId.timeCreated instanceof Date) {\n return fileId.timeCreated.toISOString();\n }\n\n return new Date().toISOString();\n};\n","import { type LengthUnit, lengthUnitSchema } from \"@kaiord/core\";\n\nconst FIT_LENGTH_UNIT_MAP: Record<number, LengthUnit> = {\n 0: \"meters\",\n 1: \"yards\",\n};\n\nexport const mapLengthUnitToKrd = (fitUnit: number | undefined): LengthUnit => {\n if (fitUnit === undefined) {\n return lengthUnitSchema.enum.meters;\n }\n\n return FIT_LENGTH_UNIT_MAP[fitUnit] || lengthUnitSchema.enum.meters;\n};\n\nexport const mapLengthUnitToFit = (krdUnit: LengthUnit): number => {\n if (krdUnit === lengthUnitSchema.enum.yards) {\n return 1;\n }\n\n return 0;\n};\n","import { type Duration, durationTypeSchema } from \"@kaiord/core\";\n\nimport type { FitDurationData } from \"./duration.converter\";\n\nexport const convertTimeDuration = (data: FitDurationData): Duration | null => {\n if (data.durationTime !== undefined) {\n return {\n type: durationTypeSchema.enum.time,\n seconds: data.durationTime,\n };\n }\n return null;\n};\n\nexport const convertDistanceDuration = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationDistance !== undefined) {\n return {\n type: durationTypeSchema.enum.distance,\n meters: data.durationDistance,\n };\n }\n return null;\n};\n\nexport const convertHeartRateLessThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationHr !== undefined) {\n return {\n type: durationTypeSchema.enum.heart_rate_less_than,\n bpm: data.durationHr,\n };\n }\n return null;\n};\n\nexport const convertHeartRateGreaterThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.repeatHr !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_heart_rate_greater_than,\n bpm: data.repeatHr,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertCaloriesDuration = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationCalories !== undefined) {\n return {\n type: durationTypeSchema.enum.calories,\n calories: data.durationCalories,\n };\n }\n return null;\n};\n\nexport const convertPowerLessThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationPower !== undefined) {\n return {\n type: durationTypeSchema.enum.power_less_than,\n watts: data.durationPower,\n };\n }\n return null;\n};\n\nexport const convertPowerGreaterThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationPower !== undefined) {\n return {\n type: durationTypeSchema.enum.power_greater_than,\n watts: data.durationPower,\n };\n }\n return null;\n};\n","import { type Duration, durationTypeSchema } from \"@kaiord/core\";\n\nimport type { FitDurationData } from \"./duration.converter\";\n\nexport const convertRepeatUntilTime = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationTime !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_time,\n seconds: data.durationTime,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertRepeatUntilDistance = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationDistance !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_distance,\n meters: data.durationDistance,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertRepeatUntilCalories = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationCalories !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_calories,\n calories: data.durationCalories,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertRepeatUntilHrLessThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationHr !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_heart_rate_less_than,\n bpm: data.durationHr,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertRepeatUntilPowerLessThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationPower !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_power_less_than,\n watts: data.durationPower,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n\nexport const convertRepeatUntilPowerGreaterThan = (\n data: FitDurationData\n): Duration | null => {\n if (data.durationPower !== undefined && data.durationStep !== undefined) {\n return {\n type: durationTypeSchema.enum.repeat_until_power_greater_than,\n watts: data.durationPower,\n repeatFrom: data.durationStep,\n };\n }\n return null;\n};\n","import { type Duration, durationTypeSchema } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../schemas/fit-duration\";\nimport {\n convertCaloriesDuration,\n convertDistanceDuration,\n convertHeartRateGreaterThan,\n convertHeartRateLessThan,\n convertPowerGreaterThan,\n convertPowerLessThan,\n convertTimeDuration,\n} from \"./duration-converters\";\nimport {\n convertRepeatUntilCalories,\n convertRepeatUntilDistance,\n convertRepeatUntilHrLessThan,\n convertRepeatUntilPowerGreaterThan,\n convertRepeatUntilPowerLessThan,\n convertRepeatUntilTime,\n} from \"./repeat-duration-converters\";\n\nexport type FitDurationData = {\n durationType?: string;\n durationTime?: number;\n durationDistance?: number;\n durationHr?: number;\n durationStep?: number;\n repeatHr?: number;\n durationCalories?: number;\n durationPower?: number;\n};\n\nconst DURATION_CONVERTERS: Record<\n string,\n (data: FitDurationData) => Duration | null\n> = {\n [fitDurationTypeSchema.enum.time]: convertTimeDuration,\n [fitDurationTypeSchema.enum.distance]: convertDistanceDuration,\n [fitDurationTypeSchema.enum.hrLessThan]: convertHeartRateLessThan,\n [fitDurationTypeSchema.enum.repeatUntilHrGreaterThan]:\n convertHeartRateGreaterThan,\n [fitDurationTypeSchema.enum.calories]: convertCaloriesDuration,\n [fitDurationTypeSchema.enum.powerLessThan]: convertPowerLessThan,\n [fitDurationTypeSchema.enum.powerGreaterThan]: convertPowerGreaterThan,\n [fitDurationTypeSchema.enum.repeatUntilTime]: convertRepeatUntilTime,\n [fitDurationTypeSchema.enum.repeatUntilDistance]: convertRepeatUntilDistance,\n [fitDurationTypeSchema.enum.repeatUntilCalories]: convertRepeatUntilCalories,\n [fitDurationTypeSchema.enum.repeatUntilHrLessThan]:\n convertRepeatUntilHrLessThan,\n [fitDurationTypeSchema.enum.repeatUntilPowerLessThan]:\n convertRepeatUntilPowerLessThan,\n [fitDurationTypeSchema.enum.repeatUntilPowerGreaterThan]:\n convertRepeatUntilPowerGreaterThan,\n};\n\nexport const convertFitDuration = (data: FitDurationData): Duration => {\n const result = fitDurationTypeSchema.safeParse(data.durationType);\n\n if (!result.success) {\n return { type: durationTypeSchema.enum.open };\n }\n\n const converter = DURATION_CONVERTERS[result.data];\n if (converter) {\n return converter(data) || { type: durationTypeSchema.enum.open };\n }\n\n return { type: durationTypeSchema.enum.open };\n};\n","import {\n type Duration,\n type DurationType,\n durationTypeSchema,\n} from \"@kaiord/core\";\n\nimport { convertFitDuration } from \"../duration/duration.converter\";\nimport { fitDurationTypeSchema } from \"../schemas/fit-duration\";\nimport type { FitWorkoutStep } from \"../shared/types\";\n\nexport const mapDuration = (step: FitWorkoutStep): Duration => {\n return convertFitDuration(step);\n};\n\nconst FIT_TO_KRD_DURATION_TYPE: Record<string, DurationType> = {\n [fitDurationTypeSchema.enum.time]: durationTypeSchema.enum.time,\n [fitDurationTypeSchema.enum.distance]: durationTypeSchema.enum.distance,\n [fitDurationTypeSchema.enum.hrLessThan]:\n durationTypeSchema.enum.heart_rate_less_than,\n [fitDurationTypeSchema.enum.repeatUntilHrGreaterThan]:\n durationTypeSchema.enum.repeat_until_heart_rate_greater_than,\n [fitDurationTypeSchema.enum.calories]: durationTypeSchema.enum.calories,\n [fitDurationTypeSchema.enum.powerLessThan]:\n durationTypeSchema.enum.power_less_than,\n [fitDurationTypeSchema.enum.powerGreaterThan]:\n durationTypeSchema.enum.power_greater_than,\n [fitDurationTypeSchema.enum.repeatUntilTime]:\n durationTypeSchema.enum.repeat_until_time,\n [fitDurationTypeSchema.enum.repeatUntilDistance]:\n durationTypeSchema.enum.repeat_until_distance,\n [fitDurationTypeSchema.enum.repeatUntilCalories]:\n durationTypeSchema.enum.repeat_until_calories,\n [fitDurationTypeSchema.enum.repeatUntilHrLessThan]:\n durationTypeSchema.enum.repeat_until_heart_rate_less_than,\n [fitDurationTypeSchema.enum.repeatUntilPowerLessThan]:\n durationTypeSchema.enum.repeat_until_power_less_than,\n [fitDurationTypeSchema.enum.repeatUntilPowerGreaterThan]:\n durationTypeSchema.enum.repeat_until_power_greater_than,\n};\n\nexport const mapDurationType = (\n fitDurationType: string | undefined\n): DurationType => {\n if (!fitDurationType) return durationTypeSchema.enum.open;\n return (\n FIT_TO_KRD_DURATION_TYPE[fitDurationType] ?? durationTypeSchema.enum.open\n );\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport type { FitTargetData } from \"./target.types\";\n\nexport const convertCadenceTarget = (data: FitTargetData): Target => {\n const rangeTarget = buildCadenceRangeTarget(data);\n if (rangeTarget) return rangeTarget;\n\n const zoneTarget = buildCadenceZoneTarget(data);\n if (zoneTarget) return zoneTarget;\n\n const valueTarget = buildCadenceValueTarget(data);\n if (valueTarget) return valueTarget;\n\n return { type: targetTypeSchema.enum.open };\n};\n\nconst buildCadenceRangeTarget = (data: FitTargetData): Target | null => {\n if (\n data.customTargetCadenceLow !== undefined &&\n data.customTargetCadenceHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.cadence,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetCadenceLow,\n max: data.customTargetCadenceHigh,\n },\n };\n }\n\n if (\n data.customTargetValueLow !== undefined &&\n data.customTargetValueHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.cadence,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetValueLow,\n max: data.customTargetValueHigh,\n },\n };\n }\n\n return null;\n};\n\nconst buildCadenceZoneTarget = (data: FitTargetData): Target | null => {\n if (data.targetCadenceZone !== undefined) {\n return {\n type: targetTypeSchema.enum.cadence,\n value: {\n unit: targetUnitSchema.enum.rpm,\n value: data.targetCadenceZone,\n },\n };\n }\n return null;\n};\n\nconst buildCadenceValueTarget = (data: FitTargetData): Target | null => {\n if (data.targetValue !== undefined) {\n return {\n type: targetTypeSchema.enum.cadence,\n value: {\n unit: targetUnitSchema.enum.rpm,\n value: data.targetValue,\n },\n };\n }\n return null;\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport type { FitTargetData } from \"./target.types\";\n\nexport const convertHeartRateTarget = (data: FitTargetData): Target => {\n const rangeTarget = buildHeartRateRangeTarget(data);\n if (rangeTarget) return rangeTarget;\n\n const zoneTarget = buildHeartRateZoneTarget(data);\n if (zoneTarget) return zoneTarget;\n\n if (data.targetValue !== undefined) {\n return convertHeartRateValue(data.targetValue);\n }\n\n return { type: targetTypeSchema.enum.open };\n};\n\nconst buildHeartRateRangeTarget = (data: FitTargetData): Target | null => {\n if (\n data.customTargetHeartRateLow !== undefined &&\n data.customTargetHeartRateHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.heart_rate,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetHeartRateLow,\n max: data.customTargetHeartRateHigh,\n },\n };\n }\n\n if (\n data.customTargetValueLow !== undefined &&\n data.customTargetValueHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.heart_rate,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetValueLow,\n max: data.customTargetValueHigh,\n },\n };\n }\n\n return null;\n};\n\nconst buildHeartRateZoneTarget = (data: FitTargetData): Target | null => {\n if (data.targetHrZone !== undefined) {\n // Validate zone is in valid range (1-5)\n // If not, treat as BPM value instead\n if (data.targetHrZone >= 1 && data.targetHrZone <= 5) {\n return {\n type: targetTypeSchema.enum.heart_rate,\n value: {\n unit: targetUnitSchema.enum.zone,\n value: data.targetHrZone,\n },\n };\n }\n // Invalid zone value, treat as BPM\n return convertHeartRateValue(data.targetHrZone);\n }\n return null;\n};\n\nconst convertHeartRateValue = (value: number): Target => {\n // Garmin FIT encoding:\n // - Values > 100: Absolute bpm (offset by 100)\n // - Values 0-100: Percentage of max HR\n if (value > 100) {\n return {\n type: targetTypeSchema.enum.heart_rate,\n value: {\n unit: targetUnitSchema.enum.bpm,\n value: value - 100,\n },\n };\n }\n\n if (value > 0) {\n return {\n type: targetTypeSchema.enum.heart_rate,\n value: {\n unit: targetUnitSchema.enum.percent_max,\n value,\n },\n };\n }\n\n return { type: targetTypeSchema.enum.open };\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport type { FitTargetData } from \"./target.types\";\n\nexport const convertPaceTarget = (data: FitTargetData): Target => {\n const rangeTarget = buildPaceRangeTarget(data);\n if (rangeTarget) return rangeTarget;\n\n const zoneTarget = buildPaceZoneTarget(data);\n if (zoneTarget) return zoneTarget;\n\n const valueTarget = buildPaceValueTarget(data);\n if (valueTarget) return valueTarget;\n\n return { type: targetTypeSchema.enum.open };\n};\n\nconst buildPaceRangeTarget = (data: FitTargetData): Target | null => {\n if (\n data.customTargetSpeedLow !== undefined &&\n data.customTargetSpeedHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.pace,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetSpeedLow,\n max: data.customTargetSpeedHigh,\n },\n };\n }\n\n if (\n data.customTargetValueLow !== undefined &&\n data.customTargetValueHigh !== undefined\n ) {\n return {\n type: targetTypeSchema.enum.pace,\n value: {\n unit: targetUnitSchema.enum.range,\n min: data.customTargetValueLow,\n max: data.customTargetValueHigh,\n },\n };\n }\n\n return null;\n};\n\nconst buildPaceZoneTarget = (data: FitTargetData): Target | null => {\n if (data.targetSpeedZone !== undefined) {\n // Validate zone is in valid range (1-5)\n // If not, treat as mps value instead\n if (data.targetSpeedZone >= 1 && data.targetSpeedZone <= 5) {\n return {\n type: targetTypeSchema.enum.pace,\n value: {\n unit: targetUnitSchema.enum.zone,\n value: data.targetSpeedZone,\n },\n };\n }\n if (data.targetSpeedZone > 0) {\n return {\n type: targetTypeSchema.enum.pace,\n value: {\n unit: targetUnitSchema.enum.mps,\n value: data.targetSpeedZone,\n },\n };\n }\n }\n return null;\n};\n\nconst buildPaceValueTarget = (data: FitTargetData): Target | null => {\n if (data.targetValue !== undefined) {\n return {\n type: targetTypeSchema.enum.pace,\n value: {\n unit: targetUnitSchema.enum.mps,\n value: data.targetValue,\n },\n };\n }\n return null;\n};\n","/**\n * Interprets a workoutPower value from FIT SDK\n * - Values 0-999: Percentage of FTP (direct)\n * - Values >= 1000: Absolute watts (value - 1000)\n */\nexport const interpretWorkoutPower = (\n value: number\n): { type: \"watts\" | \"percentage\"; value: number } => {\n if (value >= 1000) {\n return {\n type: \"watts\",\n value: value - 1000,\n };\n }\n return {\n type: \"percentage\",\n value,\n };\n};\n\n/**\n * Convert a single power value to KRD target\n * Garmin FIT encoding:\n * - Values > 1000: Absolute watts (offset by 1000)\n * - Values 0-1000: Percentage of FTP\n */\nexport const convertPowerValue = (value: number) => {\n if (value > 1000) {\n return {\n unit: \"watts\" as const,\n value: value - 1000,\n };\n }\n\n if (value > 0) {\n return {\n unit: \"percent_ftp\" as const,\n value,\n };\n }\n\n return null;\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport { convertPowerValue, interpretWorkoutPower } from \"./power-helpers\";\nimport type { FitTargetData } from \"./target.types\";\n\nexport const convertPowerTarget = (data: FitTargetData): Target => {\n const rangeTarget = buildPowerRangeTarget(data);\n if (rangeTarget) return rangeTarget;\n\n const zoneTarget = buildPowerZoneTarget(data);\n if (zoneTarget) return zoneTarget;\n\n if (data.targetValue !== undefined) {\n const powerValue = convertPowerValue(data.targetValue);\n if (powerValue) {\n return {\n type: targetTypeSchema.enum.power,\n value: powerValue,\n };\n }\n }\n\n return { type: targetTypeSchema.enum.open };\n};\n\nconst buildPowerRangeTarget = (data: FitTargetData): Target | null => {\n if (\n data.customTargetPowerLow !== undefined &&\n data.customTargetPowerHigh !== undefined\n ) {\n const minValue = interpretWorkoutPower(data.customTargetPowerLow);\n const maxValue = interpretWorkoutPower(data.customTargetPowerHigh);\n\n return {\n type: targetTypeSchema.enum.power,\n value: {\n unit: targetUnitSchema.enum.range,\n min: minValue.value,\n max: maxValue.value,\n },\n };\n }\n\n if (\n data.customTargetValueLow !== undefined &&\n data.customTargetValueHigh !== undefined\n ) {\n const minValue = interpretWorkoutPower(data.customTargetValueLow);\n const maxValue = interpretWorkoutPower(data.customTargetValueHigh);\n\n return {\n type: targetTypeSchema.enum.power,\n value: {\n unit: targetUnitSchema.enum.range,\n min: minValue.value,\n max: maxValue.value,\n },\n };\n }\n\n return null;\n};\n\nconst buildPowerZoneTarget = (data: FitTargetData): Target | null => {\n if (data.targetPowerZone !== undefined) {\n // Validate zone is in valid range (1-7)\n // If not, treat as power value instead\n if (data.targetPowerZone >= 1 && data.targetPowerZone <= 7) {\n return {\n type: targetTypeSchema.enum.power,\n value: {\n unit: targetUnitSchema.enum.zone,\n value: data.targetPowerZone,\n },\n };\n }\n const powerValue = convertPowerValue(data.targetPowerZone);\n if (powerValue) {\n return { type: targetTypeSchema.enum.power, value: powerValue };\n }\n }\n return null;\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\nimport { targetUnitSchema } from \"@kaiord/core\";\n\nimport type { FitTargetData } from \"./target.types\";\n\nexport const convertStrokeTypeTarget = (data: FitTargetData): Target => {\n if (data.targetSwimStroke !== undefined) {\n return {\n type: targetTypeSchema.enum.stroke_type,\n value: {\n unit: targetUnitSchema.enum.swim_stroke,\n value: data.targetSwimStroke,\n },\n };\n }\n\n return { type: targetTypeSchema.enum.open };\n};\n","import { type Target, targetTypeSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\nimport type { FitTargetData } from \"./target.types\";\nimport { convertCadenceTarget } from \"./target-cadence.converter\";\nimport { convertHeartRateTarget } from \"./target-heart-rate.converter\";\nimport { convertPaceTarget } from \"./target-pace.converter\";\nimport { convertPowerTarget } from \"./target-power.converter\";\nimport { convertStrokeTypeTarget } from \"./target-stroke.converter\";\n\nexport type { FitTargetData };\n\nexport const convertFitTarget = (data: FitTargetData): Target => {\n if (data.targetType === fitTargetTypeSchema.enum.power) {\n return convertPowerTarget(data);\n }\n\n if (data.targetType === fitTargetTypeSchema.enum.heartRate) {\n return convertHeartRateTarget(data);\n }\n\n if (data.targetType === fitTargetTypeSchema.enum.cadence) {\n return convertCadenceTarget(data);\n }\n\n if (data.targetType === fitTargetTypeSchema.enum.speed) {\n return convertPaceTarget(data);\n }\n\n if (data.targetType === fitTargetTypeSchema.enum.swimStroke) {\n return convertStrokeTypeTarget(data);\n }\n\n return { type: targetTypeSchema.enum.open };\n};\n","import { type Target, type TargetType, targetTypeSchema } from \"@kaiord/core\";\n\nimport { fitTargetTypeSchema } from \"../schemas/fit-target\";\nimport type { FitWorkoutStep } from \"../shared/types\";\nimport { convertFitTarget } from \"./target.converter\";\n\nexport const mapTarget = (step: FitWorkoutStep): Target => {\n return convertFitTarget(step);\n};\n\nexport const mapTargetType = (\n fitTargetType: string | undefined\n): TargetType => {\n if (fitTargetType === fitTargetTypeSchema.enum.power)\n return targetTypeSchema.enum.power;\n if (fitTargetType === fitTargetTypeSchema.enum.heartRate)\n return targetTypeSchema.enum.heart_rate;\n if (fitTargetType === fitTargetTypeSchema.enum.cadence)\n return targetTypeSchema.enum.cadence;\n if (fitTargetType === fitTargetTypeSchema.enum.speed)\n return targetTypeSchema.enum.pace;\n if (fitTargetType === fitTargetTypeSchema.enum.swimStroke)\n return targetTypeSchema.enum.stroke_type;\n return targetTypeSchema.enum.open;\n};\n","import type { WorkoutStep } from \"@kaiord/core\";\nimport { type Intensity, intensitySchema } from \"@kaiord/core\";\n\nimport { mapDuration, mapDurationType } from \"../duration/duration.mapper\";\nimport { mapEquipmentToKrd } from \"../equipment/equipment.mapper\";\nimport type { FitWorkoutStep } from \"../shared/types\";\nimport { mapTarget, mapTargetType } from \"../target/target.mapper\";\n\nexport const mapStep = (step: FitWorkoutStep, index: number): WorkoutStep => {\n const duration = mapDuration(step);\n const target = mapTarget(step);\n\n const workoutStep: WorkoutStep = {\n stepIndex: step.messageIndex ?? index,\n name: step.wktStepName,\n durationType: mapDurationType(step.durationType),\n duration,\n targetType: mapTargetType(step.targetType),\n target,\n intensity: mapIntensity(step.intensity),\n };\n\n if (step.notes !== undefined) {\n workoutStep.notes = step.notes;\n }\n\n if (step.equipment !== undefined) {\n workoutStep.equipment = mapEquipmentToKrd(step.equipment);\n }\n\n return workoutStep;\n};\n\nconst mapIntensity = (intensity: string | undefined): Intensity | undefined => {\n if (!intensity) return undefined;\n\n const normalized = intensity.toLowerCase();\n const validIntensities = intensitySchema.options;\n\n if (validIntensities.includes(normalized as Intensity)) {\n return normalized as Intensity;\n }\n\n return undefined;\n};\n","import type { RepetitionBlock, WorkoutStep } from \"@kaiord/core\";\n\nimport { fitDurationTypeSchema } from \"../schemas/fit-duration\";\nimport type { FitWorkoutStep } from \"../shared/types\";\nimport { mapStep } from \"./step.mapper\";\n\nexport const findRepetitionStepIndices = (\n workoutSteps: Array<FitWorkoutStep>\n): Set<number> => {\n const indices = new Set<number>();\n\n for (let i = 0; i < workoutSteps.length; i++) {\n const step = workoutSteps[i];\n if (\n step.durationType === fitDurationTypeSchema.enum.repeatUntilStepsCmplt\n ) {\n const startIndex = (step.durationStep || 0) as number;\n for (let j = startIndex; j < i; j++) {\n indices.add(j);\n }\n }\n }\n\n return indices;\n};\n\nexport const buildWorkoutSteps = (\n workoutSteps: Array<FitWorkoutStep>,\n repetitionStepIndices: Set<number>\n): Array<WorkoutStep | RepetitionBlock> => {\n const steps = [];\n\n for (let i = 0; i < workoutSteps.length; i++) {\n const step = workoutSteps[i];\n\n if (\n step.durationType === fitDurationTypeSchema.enum.repeatUntilStepsCmplt &&\n step.repeatSteps\n ) {\n const repetitionBlock = buildRepetitionBlock(step, workoutSteps, i);\n steps.push(repetitionBlock);\n } else if (!repetitionStepIndices.has(i)) {\n steps.push(mapStep(step, i));\n }\n }\n\n return steps;\n};\n\nexport const buildRepetitionBlock = (\n step: FitWorkoutStep,\n workoutSteps: Array<FitWorkoutStep>,\n currentIndex: number\n): RepetitionBlock => {\n const repeatCount = step.repeatSteps!;\n const startIndex = (step.durationStep || 0) as number;\n const repeatedSteps = [];\n\n for (let j = startIndex; j < currentIndex; j++) {\n repeatedSteps.push(mapStep(workoutSteps[j], j));\n }\n\n return {\n repeatCount,\n steps: repeatedSteps,\n };\n};\n","import type { Workout } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\nimport { convertLengthToMeters } from \"@kaiord/core\";\n\nimport { mapLengthUnitToKrd } from \"../length-unit/length-unit.mapper\";\nimport { mapSportType } from \"../shared/type-guards\";\nimport type { FitWorkoutMessage, FitWorkoutStep } from \"../shared/types\";\nimport { mapSubSportToKrd } from \"../sub-sport/sub-sport.mapper\";\nimport {\n buildWorkoutSteps,\n findRepetitionStepIndices,\n} from \"./repetition.builder\";\n\nexport const mapWorkout = (\n workoutMsg: FitWorkoutMessage | undefined,\n workoutSteps: Array<FitWorkoutStep>,\n logger: Logger\n): Workout => {\n logger.debug(\"Mapping workout steps\", {\n stepCount: workoutSteps.length,\n });\n\n const repetitionStepIndices = findRepetitionStepIndices(workoutSteps);\n const steps = buildWorkoutSteps(workoutSteps, repetitionStepIndices);\n\n const workout: Workout = {\n name: workoutMsg?.wktName,\n sport: mapSportType(workoutMsg?.sport),\n steps,\n };\n\n if (workoutMsg?.subSport !== undefined) {\n workout.subSport = mapSubSportToKrd(workoutMsg.subSport);\n }\n\n if (workoutMsg?.poolLength !== undefined) {\n const unit = mapLengthUnitToKrd(workoutMsg.poolLengthUnit);\n workout.poolLength = convertLengthToMeters(workoutMsg.poolLength, unit);\n workout.poolLengthUnit = \"meters\";\n }\n\n return workout;\n};\n","import type { Logger } from \"@kaiord/core\";\nimport { createFitParsingError } from \"@kaiord/core\";\n\nimport { fitMessageKeySchema } from \"../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../shared/types\";\n\nexport type ValidateMessagesOptions = {\n /** If true, throw on missing critical messages. Default: true */\n strict?: boolean;\n};\n\ntype ValidateMessagesArgs = [\n fileId: unknown,\n workoutMsg: unknown,\n messages: FitMessages,\n logger: Logger,\n options?: ValidateMessagesOptions,\n];\n\nconst checkFileId = (\n fileId: unknown,\n logger: Logger,\n strict: boolean\n): void => {\n if (!fileId) {\n const message = \"Missing required fileId message in FIT file\";\n if (strict) throw createFitParsingError(message);\n logger.warn(message);\n }\n};\n\nconst checkWorkoutMsg = (\n workoutMsg: unknown,\n logger: Logger,\n strict: boolean\n): void => {\n if (!workoutMsg) {\n const message = \"Missing required workout message in FIT file\";\n if (strict) throw createFitParsingError(message);\n logger.warn(message);\n }\n};\n\n/**\n * Validates required FIT messages are present.\n * In strict mode (default), throws on missing fileId or workout messages.\n */\nexport const validateMessages = (\n ...[fileId, workoutMsg, messages, logger, options = {}]: ValidateMessagesArgs\n): void => {\n const { strict = true } = options;\n checkFileId(fileId, logger, strict);\n checkWorkoutMsg(workoutMsg, logger, strict);\n\n const workoutMessages = messages[fitMessageKeySchema.enum.workoutMesgs];\n if (workoutMessages && workoutMessages.length > 1) {\n logger.warn(\"Multiple workout messages found, using first one\", {\n count: workoutMessages.length,\n });\n }\n};\n","import type { Logger } from \"@kaiord/core\";\nimport type { KRD } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { extractFitExtensions } from \"../extensions/extensions.extractor\";\nimport { mapMetadata } from \"../metadata/metadata.mapper\";\nimport { fitMessageKeySchema } from \"../schemas/fit-message-keys\";\nimport type { FitMessages } from \"../shared/types\";\nimport { mapWorkout } from \"../workout/workout.mapper\";\nimport { validateMessages } from \"./messages.validator\";\n\nconst KRD_VERSION = \"1.0\" as const;\n\n/**\n * Maps workout file to KRD format.\n */\nexport const mapWorkoutFileToKRD = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n const fileId = messages[fitMessageKeySchema.enum.fileIdMesgs]?.[0];\n const workoutMsg = messages[fitMessageKeySchema.enum.workoutMesgs]?.[0];\n const workoutSteps =\n messages[fitMessageKeySchema.enum.workoutStepMesgs] || [];\n\n validateMessages(fileId, workoutMsg, messages, logger);\n\n const metadata = mapMetadata(fileId, workoutMsg, logger);\n const workout = mapWorkout(workoutMsg, workoutSteps, logger);\n const fitExtensions = extractFitExtensions(messages, logger);\n\n return {\n version: KRD_VERSION,\n type: fileTypeSchema.enum.structured_workout,\n metadata,\n extensions: { structured_workout: workout, fit: fitExtensions },\n };\n};\n","import type { Logger } from \"@kaiord/core\";\nimport type { KRD } from \"@kaiord/core\";\nimport { fileTypeSchema } from \"@kaiord/core\";\n\nimport { createCourseMessages } from \"../course\";\nimport { groupBodyCompositionMessages } from \"../health/body-composition/body-composition-message-grouping\";\nimport { convertFitToKrdHealthBodyComposition } from \"../health/body-composition/fit-to-krd-health-body-composition.converter\";\nimport { convertKrdToFitHealthBodyCompositionMessages } from \"../health/body-composition/krd-health-body-composition-to-fit.converter\";\nimport { groupDailyMessages } from \"../health/daily/daily-message-grouping\";\nimport { convertFitToKrdHealthDaily } from \"../health/daily/fit-to-krd-health-daily.converter\";\nimport { convertKrdToFitHealthDailyMessages } from \"../health/daily/krd-health-daily-to-fit.converter\";\nimport { convertFitToKrdHealthHrv } from \"../health/hrv/fit-to-krd-health-hrv.converter\";\nimport { groupHrvMessages } from \"../health/hrv/hrv-message-grouping\";\nimport { convertKrdToFitHealthHrvMessages } from \"../health/hrv/krd-health-hrv-to-fit.converter\";\nimport { convertFitToKrdHealthSleep } from \"../health/sleep/fit-to-krd-health-sleep.converter\";\nimport { convertKrdToFitHealthSleepMessages } from \"../health/sleep/krd-health-sleep-to-fit.converter\";\nimport { groupSleepMessages } from \"../health/sleep/sleep-message-grouping\";\nimport { convertFitToKrdHealthStress } from \"../health/stress/fit-to-krd-health-stress.converter\";\nimport { convertKrdToFitHealthStressMessages } from \"../health/stress/krd-health-stress-to-fit.converter\";\nimport { groupStressMessages } from \"../health/stress/stress-message-grouping\";\nimport { convertFitToKrdHealthWeight } from \"../health/weight/fit-to-krd-health-weight.converter\";\nimport { convertKrdToFitHealthWeightMessages } from \"../health/weight/krd-health-weight-to-fit.converter\";\nimport { groupWeightMessages } from \"../health/weight/weight-message-grouping\";\nimport { convertKRDToMessages } from \"../krd-to-fit/krd-to-fit.converter\";\nimport type { FitMessages } from \"../shared/types\";\nimport { mapActivityFileToKRD } from \"./activity.mapper\";\nimport { createActivityMessages } from \"./activity-messages.creator\";\nimport { detectFileType } from \"./file-type-detector\";\nimport { mapWorkoutFileToKRD } from \"./workout.mapper\";\nimport { groupWorkoutMessages } from \"./workout-message-grouping\";\n\nexport const mapMessagesToKRD = (\n messages: FitMessages,\n logger: Logger\n): KRD => {\n logger.debug(\"Mapping FIT messages to KRD\", {\n messageCount: Object.keys(messages).length,\n });\n\n const fileType = detectFileType(messages);\n logger.debug(\"Detected file type\", { fileType });\n\n switch (fileType) {\n case fileTypeSchema.enum.sleep_record:\n return convertFitToKrdHealthSleep(messages, logger);\n case fileTypeSchema.enum.weight_measurement:\n return convertFitToKrdHealthWeight(messages, logger);\n case fileTypeSchema.enum.body_composition:\n return convertFitToKrdHealthBodyComposition(messages, logger);\n case fileTypeSchema.enum.hrv_summary:\n return convertFitToKrdHealthHrv(messages, logger);\n case fileTypeSchema.enum.daily_wellness:\n return convertFitToKrdHealthDaily(messages, logger);\n case fileTypeSchema.enum.stress_episode:\n return convertFitToKrdHealthStress(messages, logger);\n case fileTypeSchema.enum.recorded_activity:\n return mapActivityFileToKRD(messages, logger);\n case fileTypeSchema.enum.structured_workout:\n default:\n return mapWorkoutFileToKRD(messages, logger);\n }\n};\n\n/**\n * Creates FIT messages from KRD format with file-type routing.\n */\nexport const createFitMessages = (\n krd: KRD,\n logger: Logger\n): Record<string, unknown[]> => {\n const fileType = krd.type;\n logger.debug(\"Creating FIT messages from KRD\", { fileType });\n\n switch (fileType) {\n case \"structured_workout\":\n return groupWorkoutMessages(convertKRDToMessages(krd, logger));\n case \"recorded_activity\":\n return createActivityMessages(krd, logger);\n case \"course\":\n return createCourseMessages(krd, logger);\n case \"sleep_record\":\n return groupSleepMessages(\n convertKrdToFitHealthSleepMessages(krd, logger)\n );\n case \"weight_measurement\":\n return groupWeightMessages(\n convertKrdToFitHealthWeightMessages(krd, logger)\n );\n case \"body_composition\":\n return groupBodyCompositionMessages(\n convertKrdToFitHealthBodyCompositionMessages(krd, logger)\n );\n case \"hrv_summary\":\n return groupHrvMessages(convertKrdToFitHealthHrvMessages(krd, logger));\n case \"daily_wellness\":\n return groupDailyMessages(\n convertKrdToFitHealthDailyMessages(krd, logger)\n );\n case \"stress_episode\":\n return groupStressMessages(\n convertKrdToFitHealthStressMessages(krd, logger)\n );\n default:\n throw new Error(`Unsupported FIT file type: ${fileType}`);\n }\n};\n","/**\n * Garmin FIT SDK Adapter - converts FIT workout files to KRD format\n * References: https://developer.garmin.com/fit/file-types/workout/\n */\n\nimport { Decoder, Encoder, Stream } from \"@garmin/fitsdk\";\nimport type { KRD } from \"@kaiord/core\";\nimport type { BinaryReader } from \"@kaiord/core\";\nimport type { BinaryWriter } from \"@kaiord/core\";\nimport type { Logger } from \"@kaiord/core\";\nimport { createFitParsingError } from \"@kaiord/core\";\n\nimport { convertKRDToMessages } from \"./krd-to-fit/krd-to-fit.converter\";\nimport { mapMessagesToKRD } from \"./messages/messages.mapper\";\nimport type { FitMessages } from \"./shared/types\";\n\nexport const createGarminFitSdkReader =\n (logger: Logger): BinaryReader =>\n async (buffer: Uint8Array): Promise<KRD> => {\n try {\n logger.debug(\"Parsing FIT file\", { bufferSize: buffer.length });\n\n if (buffer.length === 0) {\n logger.error(\"Empty FIT buffer\");\n throw createFitParsingError(\"Cannot parse empty FIT buffer\");\n }\n\n const stream = Stream.fromByteArray(Array.from(buffer));\n const decoder = new Decoder(stream);\n const { messages, errors } = decoder.read();\n\n if (errors.length > 0) {\n logger.error(\"FIT parsing errors detected\", { errors });\n throw createFitParsingError(`FIT parsing errors: ${errors.join(\", \")}`);\n }\n\n logger.info(\"FIT file parsed successfully\");\n return mapMessagesToKRD(messages as FitMessages, logger);\n } catch (error) {\n if (error instanceof Error && error.name === \"FitParsingError\") {\n throw error;\n }\n logger.error(\"Failed to parse FIT file\", { error });\n throw createFitParsingError(\"Failed to parse FIT file\", error);\n }\n };\n\nexport const createGarminFitSdkWriter =\n (logger: Logger): BinaryWriter =>\n async (krd: KRD): Promise<Uint8Array> => {\n try {\n logger.debug(\"Encoding KRD to FIT\");\n\n const encoder = new Encoder();\n const messages = convertKRDToMessages(krd, logger);\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i];\n try {\n logger.debug(`Writing message ${i + 1}/${messages.length}`, {\n mesgNum: (message as { mesgNum?: number }).mesgNum,\n });\n encoder.writeMesg(message);\n } catch (error) {\n logger.error(`Failed to write message ${i + 1}`, {\n message: JSON.stringify(message, null, 2),\n error,\n });\n throw error;\n }\n }\n\n const buffer = encoder.close();\n logger.info(\"KRD encoded to FIT successfully\");\n return new Uint8Array(buffer);\n } catch (error) {\n if (error instanceof Error && error.name === \"FitParsingError\") {\n throw error;\n }\n logger.error(\"Failed to write FIT file\", { error });\n throw createFitParsingError(\"Failed to write FIT file\", error);\n }\n };\n","/**\n * @kaiord/fit - FIT format adapter for Kaiord\n */\n\nimport type { BinaryReader, BinaryWriter, Logger } from \"@kaiord/core\";\nimport { createConsoleLogger } from \"@kaiord/core\";\n\nimport {\n createGarminFitSdkReader,\n createGarminFitSdkWriter,\n} from \"./adapters/garmin-fitsdk\";\n\nexport const createFitReader = (logger?: Logger): BinaryReader =>\n createGarminFitSdkReader(logger || createConsoleLogger());\n\nexport const createFitWriter = (logger?: Logger): BinaryWriter =>\n createGarminFitSdkWriter(logger || createConsoleLogger());\n\nexport const fitReader: BinaryReader = createFitReader();\nexport const fitWriter: BinaryWriter = createFitWriter();\n\nexport { createGarminFitSdkReader, createGarminFitSdkWriter };\n"]}
|