@cornerstonejs/dicom-image-loader 2.1.4 → 2.1.5
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/dynamic-import/031089e563a18ada8441.wasm +0 -0
- package/dist/dynamic-import/20fc4c659b85ccd2a9c0.wasm +0 -0
- package/dist/dynamic-import/5004fdc02f329ce53b69.wasm +0 -0
- package/dist/dynamic-import/54.min.js +2 -0
- package/dist/dynamic-import/54.min.js.map +1 -0
- package/dist/dynamic-import/548.min.js +2 -0
- package/dist/dynamic-import/548.min.js.map +1 -0
- package/dist/dynamic-import/918.min.js +2 -0
- package/dist/dynamic-import/918.min.js.map +1 -0
- package/dist/dynamic-import/958.min.js +3 -0
- package/dist/dynamic-import/958.min.js.LICENSE.txt +5 -0
- package/dist/dynamic-import/958.min.js.map +1 -0
- package/dist/dynamic-import/c22b37c3488e1d6c3aa4.wasm +0 -0
- package/dist/dynamic-import/cornerstoneDICOMImageLoader.min.js +1 -1
- package/dist/dynamic-import/cornerstoneDICOMImageLoader.min.js.map +1 -1
- package/dist/esm/init.js +1 -2
- package/package.json +3 -3
- package/dist/dynamic-import/4de9823ef4bef156227c.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cornerstoneDICOMImageLoader.min.js","mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,EAAQG,QAAQ,uBAAwBA,QAAQ,iBACxC,mBAAXC,QAAyBA,OAAOC,IAC9CD,OAAO,8BAA+B,CAAC,sBAAuB,gBAAiBJ,GACrD,iBAAZC,QACdA,QAAqC,4BAAID,EAAQG,QAAQ,uBAAwBA,QAAQ,iBAEzFJ,EAAkC,4BAAIC,EAAQD,EAAK,uBAAwBA,EAAkB,YAC9F,CATD,CASGO,MAAM,CAACC,EAAkCC,I,yFCT5CN,EAAOD,QAAUM,C,UCAjBL,EAAOD,QAAUO,C,GCCbC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaX,QAGrB,IAAIC,EAASO,EAAyBE,GAAY,CAGjDV,QAAS,CAAC,GAOX,OAHAa,EAAoBH,GAAUT,EAAQA,EAAOD,QAASS,GAG/CR,EAAOD,OACf,CAGAS,EAAoBK,EAAID,ECxBxBJ,EAAoBM,EAAI,CAACf,EAASgB,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAElB,EAASiB,IAC5EE,OAAOC,eAAepB,EAASiB,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAoBc,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAOnB,MAAQ,IAAIoB,SAAS,cAAb,EAChB,CAAE,MAAOC,GACR,GAAsB,iBAAXC,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBlB,EAAoBS,EAAI,CAACU,EAAKC,IAAUV,OAAOW,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFpB,EAAoBwB,EAAKjC,IACH,oBAAXkC,QAA0BA,OAAOC,aAC1ChB,OAAOC,eAAepB,EAASkC,OAAOC,YAAa,CAAEC,MAAO,WAE7DjB,OAAOC,eAAepB,EAAS,aAAc,CAAEoC,OAAO,GAAO,E,MCL9D,IAAIC,EACA5B,EAAoBc,EAAEe,gBAAeD,EAAY5B,EAAoBc,EAAEgB,SAAW,IACtF,IAAIC,EAAW/B,EAAoBc,EAAEiB,SACrC,IAAKH,GAAaG,IACbA,EAASC,gBACZJ,EAAYG,EAASC,cAAcC,MAC/BL,GAAW,CACf,IAAIM,EAAUH,EAASI,qBAAqB,UAC5C,GAAGD,EAAQE,OAEV,IADA,IAAIC,EAAIH,EAAQE,OAAS,EAClBC,GAAK,IAAMT,GAAWA,EAAYM,EAAQG,KAAKJ,GAExD,CAID,IAAKL,EAAW,MAAM,IAAIU,MAAM,yDAChCV,EAAYA,EAAUW,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpFvC,EAAoBwC,EAAIZ,C,KClBxB5B,EAAoByC,EAAIV,SAASW,SAAWC,KAAKb,SAASc,K,qBCE3C,SAAS,EACtBC,EACAC,EACAC,GAEA,QAAmB5C,IAAf0C,EACF,MAAM,IAAIP,MAAM,wCAElB,GAAIO,EAAWT,OAAS,GAAM,EAC5B,MAAM,IAAIE,MACR,+BAA+BO,EAAWT,iCAI9C,MAAMY,EAAYH,EAAWT,OAAS,EAEtC,IAAIa,EAAW,EAEXC,EAAc,EAElB,GAAIH,EACF,IAAK,IAAIV,EAAI,EAAGA,EAAIW,EAAWX,IAC7BS,EAAYI,KAAiBL,EAAWI,KACxCH,EAAYI,KAAiBL,EAAWI,KACxCH,EAAYI,KAAiBL,EAAWI,KACxCH,EAAYI,KAAiB,SAOjCJ,EAAYK,IAAIN,EAClB,CCjCe,SAAS,EACtBA,EACAC,EACAC,GAEA,QAAmB5C,IAAf0C,EACF,MAAM,IAAIP,MAAM,wCAElB,GAAIO,EAAWT,OAAS,GAAM,EAC5B,MAAM,IAAIE,MACR,+BAA+BO,EAAWT,iCAI9C,MAAMY,EAAYH,EAAWT,OAAS,EAEtC,IAAIc,EAAc,EAEdE,EAAS,EAETC,EAASL,EAETM,EAAqB,EAAZN,EAEb,GAAID,EACF,IAAK,IAAIV,EAAI,EAAGA,EAAIW,EAAWX,IAC7BS,EAAYI,KAAiBL,EAAWO,KACxCN,EAAYI,KAAiBL,EAAWQ,KACxCP,EAAYI,KAAiBL,EAAWS,KACxCR,EAAYI,KAAiB,SAG/B,IAAK,IAAIb,EAAI,EAAGA,EAAIW,EAAWX,IAC7BS,EAAYI,KAAiBL,EAAWO,KACxCN,EAAYI,KAAiBL,EAAWQ,KACxCP,EAAYI,KAAiBL,EAAWS,IAG9C,CCtCe,SAAS,EACtBT,EACAC,EACAC,GAEA,QAAmB5C,IAAf0C,EACF,MAAM,IAAIP,MAAM,oDAElB,GAAIO,EAAWT,OAAS,GAAM,EAC5B,MAAM,IAAIE,MACR,2CAA2CO,EAAWT,iCAI1D,MAAMY,EAAYH,EAAWT,OAAS,EAEtC,IAAImB,EAAW,EAEXL,EAAc,EAElB,GAAIH,EACF,IAAK,IAAIV,EAAI,EAAGA,EAAIW,EAAWX,IAAK,CAClC,MAAMmB,EAAIX,EAAWU,KACfE,EAAKZ,EAAWU,KAChBG,EAAKb,EAAWU,KAEtBT,EAAYI,KAAiBM,EAAI,OAASE,EAAK,KAC/CZ,EAAYI,KACVM,EAAI,QAAWC,EAAK,KAAO,QAAWC,EAAK,KAC7CZ,EAAYI,KAAiBM,EAAI,OAASC,EAAK,KAC/CX,EAAYI,KAAiB,GAC/B,MAKF,IAAK,IAAIb,EAAI,EAAGA,EAAIW,EAAWX,IAAK,CAClC,MAAMmB,EAAIX,EAAWU,KACfE,EAAKZ,EAAWU,KAChBG,EAAKb,EAAWU,KAEtBT,EAAYI,KAAiBM,EAAI,OAASE,EAAK,KAC/CZ,EAAYI,KACVM,EAAI,QAAWC,EAAK,KAAO,QAAWC,EAAK,KAC7CZ,EAAYI,KAAiBM,EAAI,OAASC,EAAK,IACjD,CACF,CC9Ce,SAAS,EACtBZ,EACAC,EACAC,GAEA,QAAmB5C,IAAf0C,EACF,MAAM,IAAIP,MAAM,oDAElB,GAAIO,EAAWT,OAAS,GAAM,EAC5B,MAAM,IAAIE,MACR,2CAA2CO,EAAWT,iCAI1D,MAAMY,EAAYH,EAAWT,OAAS,EAEtC,IAAIc,EAAc,EAEdS,EAAS,EAETC,EAAUZ,EAEVa,EAAsB,EAAZb,EAEd,GAAID,EACF,IAAK,IAAIV,EAAI,EAAGA,EAAIW,EAAWX,IAAK,CAClC,MAAMmB,EAAIX,EAAWc,KACfF,EAAKZ,EAAWe,KAChBF,EAAKb,EAAWgB,KAEtBf,EAAYI,KAAiBM,EAAI,OAASE,EAAK,KAC/CZ,EAAYI,KACVM,EAAI,QAAWC,EAAK,KAAO,QAAWC,EAAK,KAC7CZ,EAAYI,KAAiBM,EAAI,OAASC,EAAK,KAC/CX,EAAYI,KAAiB,GAC/B,MAKF,IAAK,IAAIb,EAAI,EAAGA,EAAIW,EAAWX,IAAK,CAClC,MAAMmB,EAAIX,EAAWc,KACfF,EAAKZ,EAAWe,KAChBF,EAAKb,EAAWgB,KAEtBf,EAAYI,KAAiBM,EAAI,OAASE,EAAK,KAC/CZ,EAAYI,KACVM,EAAI,QAAWC,EAAK,KAAO,QAAWC,EAAK,KAC7CZ,EAAYI,KAAiBM,EAAI,OAASC,EAAK,IACjD,CACF,C,4aCjDA,SAASK,EAAiBC,EAAeC,GACvC,MAAMC,EAAaF,EAAI3B,OACjB8B,EAAa,IAAIC,kBAAkBF,GAEzC,IAAK,IAAI5B,EAAI,EAAGA,EAAI4B,IAAc5B,EAChC6B,EAAW7B,GAAK0B,EAAI1B,IAAM2B,EAG5B,OAAOE,CACT,CAEA,SAASE,EAAiBvB,EAAYwB,EAAOC,GAC3C,MAAMC,EAAO1B,EAAW,GAAGwB,gCAC3B,GAAIE,EACF,OAAOC,QAAQC,QAAQF,GAGzB,MAAMG,EAASC,EAAAA,SAAAA,IAAa,mBAAoB9B,EAAW+B,SAE3D,OAAIF,GAAiC,mBAAhBA,EAAOG,KACnBH,EAAOG,MAAMrF,GAClBA,EAASA,EAAO,GAAG6E,gCAAsCC,IAGpDE,QAAQC,QACbC,EAASA,EAAO,GAAGL,gCAAsCC,EAG/D,CASe,SAAS,EACtBzB,EACAC,EACAC,GAEA,MAAMC,EAAYH,EAAWiC,QAAUjC,EAAWkC,KAC5CC,EAAYnC,EAAWmC,UAE7BR,QAAQS,IAAI,CACVb,EAAiBvB,EAAY,MAAO,MACpCuB,EAAiBvB,EAAY,QAAS,MACtCuB,EAAiBvB,EAAY,OAAQ,QACpCgC,MAAK,EAAEK,EAAOC,EAAOC,MACtB,IAAKF,IAAUC,IAAUC,EACvB,MAAM,IAAI9C,MACR,4FAIJ,MAAM+C,EAAMH,EAAM9C,OAClB,IAAIkD,EAAW,EACXpC,EAAc,EAElB,MAAMqC,EAAQ1C,EAAW2C,qCAAqC,GACxDxB,EACmD,IAAvDnB,EAAW2C,qCAAqC,GAAW,EAAI,EAE3DC,EAAe3B,EAAiBoB,EAAOlB,GACvC0B,EAAe5B,EAAiBqB,EAAOnB,GACvC2B,EAAe7B,EAAiBsB,EAAOpB,GAE7C,GAAIjB,EACF,IAAK,IAAIV,EAAI,EAAGA,EAAIW,IAAaX,EAAG,CAClC,IAAIV,EAAQqD,EAAUM,KAElB3D,EAAQ4D,EACV5D,EAAQ,EACCA,EAAQ4D,EAAQF,EAAM,EAC/B1D,EAAQ0D,EAAM,EAEd1D,GAAS4D,EAGXzC,EAAYI,KAAiBuC,EAAa9D,GAC1CmB,EAAYI,KAAiBwC,EAAa/D,GAC1CmB,EAAYI,KAAiByC,EAAahE,GAC1CmB,EAAYI,KAAiB,GAC/B,MAKF,IAAK,IAAIb,EAAI,EAAGA,EAAIW,IAAaX,EAAG,CAClC,IAAIV,EAAQqD,EAAUM,KAElB3D,EAAQ4D,EACV5D,EAAQ,EACCA,EAAQ4D,EAAQF,EAAM,EAC/B1D,EAAQ0D,EAAM,EAEd1D,GAAS4D,EAGXzC,EAAYI,KAAiBuC,EAAa9D,GAC1CmB,EAAYI,KAAiBwC,EAAa/D,GAC1CmB,EAAYI,KAAiByC,EAAahE,EAC5C,IAEJ,CCzGA,SAASiE,EAAiBC,EAAkBC,GAC1C,GAAKD,EAAQE,SAASD,IAAyC,IAAjCD,EAAQE,SAASD,GAAK1D,OAIpD,MAAO,CACLyD,EAAQG,OAAOF,EAAK,GACpBD,EAAQG,OAAOF,EAAK,GACpBD,EAAQG,OAAOF,EAAK,GAExB,CAEA,SAASG,EAAWC,EAAqBJ,EAAaK,GACpD,MAAMpC,EAAM,GACNqC,EAAUF,EAAWH,SAASD,GAEpC,IAAK,IAAIzD,EAAI,EAAGA,EAAI8D,EAAc,GAAI9D,IAEX,KAArB8D,EAAc,GAChBpC,EAAI1B,GAAK6D,EAAWF,OAAOF,EAAKzD,GAEhC0B,EAAI1B,GAAK6D,EAAWG,UAAUhE,EAAI+D,EAAQE,YAI9C,OAAOvC,CACT,CA+GA,QA1BA,SAA6B8B,GAC3B,MAAMU,EAAmB,CACvBC,gBAAiBX,EAAQG,OAAO,aAChCS,0BAA2BZ,EAAQa,OAAO,aAC1C3B,KAAMc,EAAQG,OAAO,aACrBlB,QAASe,EAAQG,OAAO,aACxBW,cAAed,EAAQG,OAAO,aAC9BY,WAAYf,EAAQG,OAAO,aAC3Ba,QAAShB,EAAQG,OAAO,aACxBc,oBAAqBjB,EAAQG,OAAO,aACpCe,oBAAqBlB,EAAQG,OAAO,aACpCgB,iBAAkBnB,EAAQa,OAAO,cAYnC,OAtCF,SACEb,EACAU,GAI4B,IAFAV,EAAQG,OAAO,cAGzCO,EAAiBU,mBAAqBpB,EAAQG,OAAO,aACrDO,EAAiBW,kBAAoBrB,EAAQG,OAAO,eAEpDO,EAAiBU,mBAAqBpB,EAAQsB,MAAM,aACpDZ,EAAiBW,kBAAoBrB,EAAQsB,MAAM,aAEvD,CAgBEC,CAAmCvB,EAASU,GAGK,kBAA/CA,EAAiBE,2BACjBZ,EAAQE,SAASsB,WArGrB,SACExB,EACAU,GAEAA,EAAiBf,qCAAuCI,EACtDC,EACA,aAEFU,EAAiBe,uCAAyC1B,EACxDC,EACA,aAEFU,EAAiBgB,sCAAwC3B,EACvDC,EACA,aAM+D,IAA7DU,EAAiBf,qCAAqC,KACxDe,EAAiBf,qCAAqC,GAAK,MAC3De,EAAiBe,uCAAuC,GAAK,MAC7Df,EAAiBgB,sCAAsC,GAAK,OAW9D,MAAMC,EACJjB,EAAiBf,qCAAqC,GAElDiC,EADU5B,EAAQE,SAAS2B,UACAtF,SAAWoF,EAAgB,EAAI,GAI9DjB,EAAiBf,qCAAqC,KACtDiC,IAEAlB,EAAiBf,qCAAqC,GAAKiC,EAC3DlB,EAAiBe,uCAAuC,GACtDG,EACFlB,EAAiBgB,sCAAsC,GACrDE,GAGJlB,EAAiBoB,+BAAiC1B,EAChDJ,EACA,YACAU,EAAiBf,sCAEnBe,EAAiBqB,iCAAmC3B,EAClDJ,EACA,YACAU,EAAiBe,wCAEnBf,EAAiBsB,gCAAkC5B,EACjDJ,EACA,YACAU,EAAiBgB,sCAErB,CAqCIO,CAAwBjC,EAASU,GAG5BA,CACT,ECvIA,SAASwB,EAAOjB,EAA6BZ,GAC3C,IAAI8B,EAAgB9B,EAAWF,OAAO,YAAa,GAE7B,IAAlBgC,IACFA,EAAgB,OAElB,IAAIC,EAAmB,EAGrBA,EAD0B,IAAxBnB,EACiBZ,EAAWF,OAAO,YAAa,GAE/BE,EAAWiB,MAAM,YAAa,GAEnD,MAEMpD,EAAM,CACVmE,GAAI,IACJD,mBACAE,gBALsBjC,EAAWF,OAAO,YAAa,GAMrDjC,IAAK,IAIP,IAAK,IAAI1B,EAAI,EAAGA,EAAI2F,EAAe3F,IAE/B0B,EAAIA,IAAI1B,GADkB,IAAxByE,EACWZ,EAAWF,OAAO,YAAa3D,GAE/B6D,EAAWiB,MAAM,YAAa9E,GAI/C,OAAO0B,CACT,CAoBA,QAlBA,SAAiB+C,EAA6BsB,GAC5C,IAAKA,IAAgBA,EAAYC,QAAUD,EAAYC,MAAMjG,OAC3D,OAEF,MAAMkG,EAAkB,GAExB,IAAK,IAAIjG,EAAI,EAAGA,EAAI+F,EAAYC,MAAMjG,OAAQC,IAAK,CACjD,MACM0B,EAAMgE,EAAOjB,EADAsB,EAAYC,MAAMhG,GAAGwD,SAGpC9B,GACFuE,EAAKC,KAAKxE,EAEd,CAEA,OAAOuE,CACT,ECAA,QArCA,SAAiDzC,GAE/C,MAAM2C,EAAc3C,EAAQa,OAAO,aAEnC,GACkB,8BAAhB8B,GACgB,gCAAhBA,EAEA,OAAO,EAKT,MAAMC,EAAmB5C,EAAQ6C,YAAY,aACvCC,EAAe9C,EAAQ6C,YAAY,aAEzC,QAAyBvI,IAArBsI,QAAmDtI,IAAjBwI,EAA4B,CAChE,MAAMC,EA7BV,SAAgC/C,GAC9B,MAAMiB,EAAsBjB,EAAQG,OAAO,aACrCY,EAAaf,EAAQG,OAAO,aAElC,OAA4B,IAAxBc,EACK,GAGD,GAAMF,EAAa,CAC7B,CAoBgCiC,CAAuBhD,GAInD,OAFE+C,EAAsBD,EAAeF,EAEb,EACjB,EAGF,CACT,CAGA,OAAI5C,EAAQE,SAAS+C,WAAajD,EAAQE,SAAS+C,UAAU1G,OAAS,EAC7D,EAIFyD,EAAQG,OAAO,YACxB,EC1BA,QAvBA,SACEH,EACAC,EACAiD,GAEA,MAAMC,EAAS,GACTC,EAAgBpD,EAAQa,OAAOZ,GAErC,IAAKmD,EACH,OAEF,MAAMC,EAAQD,EAAcC,MAAM,MAElC,KAAIH,GAAiBG,EAAM9G,OAAS2G,GAApC,CAGA,IAAK,IAAI1G,EAAI,EAAGA,EAAI6G,EAAM9G,OAAQC,IAChC2G,EAAOT,KAAKY,WAAWD,EAAM7G,KAG/B,OAAO2G,CALP,CAMF,E,aCkBA,QAlCA,SAAsBpE,GAEpB,MAAMwE,EAAkBxE,EAAQyE,QAAQ,KAExC,IAAIC,EAAM1E,EAAQ2E,UAAUH,EAAkB,GAC9C,MAAMI,EAAaF,EAAID,QAAQ,UAE/B,IAAII,EAEJ,IAAoB,IAAhBD,EAAmB,CACrB,MAAME,EAAWJ,EAAIC,UAAUC,EAAa,GAE5CC,EAAQE,SAASD,EAAU,IAC3BJ,EAAMA,EAAIC,UAAU,EAAGC,EAAa,EACtC,CAYA,MAAO,CACLI,OAXahF,EAAQ2E,UAAU,EAAGH,GAYlCE,MACAG,QACAI,oBAN8B1J,IAAVsJ,EAAsBA,EAAQ,OAAItJ,EAQ1D,ECrCA,IAAI2J,EAAyB,CAE3BC,IAAAA,CAAKC,EAAKV,GACRU,EAAID,KAAK,MAAOT,GAAK,EACvB,EAEAW,UAAAA,GACE,EAGFC,iBAAiBF,GACRxF,QAAQC,QAAQuF,EAAIG,UAG7BC,YAAAA,GACE,EAEFC,QAAQ,GAGH,SAASC,EAAWC,GACzBT,EAAUpJ,OAAO8J,OAAOV,EAASS,EACnC,CAEO,SAASE,IACd,OAAOX,CACT,CCoIA,QAxJA,SACER,EACA1E,EACA8F,EAAyC,CAAC,EAC1CC,EAAiC,CAAC,GAElC,MAAMb,EAAUW,IAEVG,EAAoBZ,IACxB,GAAwC,mBAA7BF,EAAQc,iBAAiC,CAClD,MAAMC,EAAQ,IAAIvI,MAAM,kBAExBuI,EAAMC,QAAUd,EAChBa,EAAMV,SAAWH,EAAIG,SACrBU,EAAME,OAASf,EAAIe,OACnBjB,EAAQc,iBAAiBC,EAC3B,GAGIb,EAAM,IAAIgB,eAGVC,EACJ,IAAIzG,SAAqB,CAACC,EAASyG,KACjCpB,EAAQC,KAAKC,EAAKV,EAAKoB,EAAgBC,GACvC,MAAMQ,EAAoBrB,EAAQG,WAChCD,EACApF,EACA8F,EACAC,GAGFX,EAAIoB,aAAe,cAEnB,MAAMC,EAAU3K,OAAO8J,OAAO,CAAC,EAAGE,EAAgBS,GAElDzK,OAAO4K,KAAKD,GAASE,SAAQ,SAAU/K,GAChB,OAAjB6K,EAAQ7K,KAGA,WAARA,IAAgD,IAA5B8I,EAAID,QAAQ,YAGpCW,EAAIwB,iBAAiBhL,EAAK6K,EAAQ7K,IACpC,IAEAmK,EAAOc,SAAW,CAChBhH,UACAyG,UAEFP,EAAOrB,IAAMA,EACbqB,EAAO/F,QAAUA,EAGjBoF,EAAI0B,YAAc,SAAUC,GAEtB7B,EAAQ4B,aACV5B,EAAQ4B,YAAYC,EAAOhB,GAI7B,MAAMiB,EAAY,CAChBtC,MACA1E,YAGFiH,EAAAA,EAAAA,cAAaC,EAAAA,YAAa,4BAA6BF,EACzD,EAGA5B,EAAI+B,UAAY,SAAUJ,GAEpB7B,EAAQiC,WACVjC,EAAQiC,UAAUJ,EAAOhB,GAG3B,MAAMiB,EAAY,CAChBtC,MACA1E,YAIFiH,EAAAA,EAAAA,cAAaC,EAAAA,YAAa,0BAA2BF,EACvD,EAGA5B,EAAIgC,mBAAqB,SAAUL,GAE7B7B,EAAQkC,mBACVlC,EAAQkC,mBAAmBL,EAAOhB,GAQb,IAAnBX,EAAIiC,aAEa,MAAfjC,EAAIe,QAAiC,MAAff,EAAIe,OAC5BjB,EACGI,iBAAiBF,GACjBnF,KAAKJ,GACLyH,OAAM,KACLtB,EAAiBZ,GAEjBkB,EAAOlB,EAAI,KAGfY,EAAiBZ,GAEjBkB,EAAOlB,IAGb,EAGAA,EAAImC,WAAa,SAAUC,GAEzB,MAAMC,EAASD,EAAUC,OAEzB,IAAIC,EAEAC,EAEAH,EAAUI,mBACZF,EAAQF,EAAUE,MAClBC,EAAkBE,KAAKC,MAAOL,EAASC,EAAS,MAI9CxC,EAAQqC,YACVrC,EAAQqC,WAAWC,EAAWzB,EAElC,EACAX,EAAI2C,QAAU,WACZ/B,EAAiBZ,GACjBkB,EAAOlB,EACT,EAEAA,EAAI4C,QAAU,WACZhC,EAAiBZ,GACjBkB,EAAOlB,EACT,EACAA,EAAI6C,MAAM,IAKd,OAFA5B,EAAQjB,IAAMA,EAEPiB,CACT,EC9JA,SAAS6B,EAAWC,EAAOxI,EAAM+B,GAC/B,GAAIA,EAAayG,EAAM3K,OAASmC,EAAKnC,OACnC,OAAO,EAGT,IAAI4K,EAAW1G,EAEf,IAAK,IAAIjE,EAAI,EAAGA,EAAI0K,EAAM3K,OAAQC,IAChC,GAAI0K,EAAM1K,KAAOkC,EAAKyI,KACpB,OAAO,EAIX,OAAO,CACT,CAgCA,QApBA,SACEzI,EACA0I,EACAC,GAEAA,EAASA,GAAU,EAEnB,MAAMH,EAjBR,SAA4BE,GAC1B,MAAME,EAAO,IAAIC,WAAWH,EAAI7K,QAEhC,IAAK,IAAIC,EAAI,EAAGgL,EAAIJ,EAAI7K,OAAQC,EAAIgL,EAAGhL,IACrC8K,EAAK9K,GAAK4K,EAAIK,WAAWjL,GAG3B,OAAO8K,CACT,CASgBI,CAAmBN,GAEjC,IAAK,IAAI5K,EAAI6K,EAAQ7K,EAAIkC,EAAKnC,OAAQC,IACpC,GAAI0K,EAAM,KAAOxI,EAAKlC,IAEhByK,EAAWC,EAAOxI,EAAMlC,GAC1B,OAAOA,EAKb,OAAQ,CACV,GC1CM,mBAAEmL,GAAuBC,EAAAA,MAahB,SAASC,EACtBC,EACAC,EACA9D,GAEAA,IAAY,CAAC,EAEb,MAAMK,EAAW,IAAIiD,WAAWQ,GAC1BC,IAAc/D,GAAS+D,UAC7B,IAA0C,IAAtCF,EAAYtE,QAAQ,aACtB,MAAO,CACLsE,cACAG,mBAAoBD,EAChBL,EAAmBO,cACnBP,EAAmBQ,gBACvBhJ,UAAWmF,GAIf,IAAI,WAAE8D,EAAU,gBAAEC,EAAe,SAAEC,EAAQ,qBAAEC,GAAyBtE,EAKtE,GAFAmE,IAAeI,EAAkBlE,EAAU,aAEvB,IAAhB8D,EACF,MAAM,IAAI3L,MAAM,+CAGlB,IAAK6L,EAAU,CACb,MAAMG,EAyDH,SAA4B/J,EAAM2I,EAAQ9K,GAC/C8K,EAASA,GAAU,EACnB9K,EAASA,GAAUmC,EAAKnC,OAAS8K,EACjC,IAAID,EAAM,GAEV,IAAK,IAAI5K,EAAI6K,EAAQ7K,EAAI6K,EAAS9K,EAAQC,IACxC4K,GAAOsB,OAAOC,aAAajK,EAAKlC,IAGlC,OAAO4K,CACT,CAnEmBwB,CAAmBtE,EAAU,EAAG8D,GAK/C,GAHAC,EAAkBI,EAAOpF,MAAM,QAC/BiF,EAsCG,SAAsBG,GAC3B,IAAK,IAAIjM,EAAI,EAAGA,EAAIiM,EAAOlM,OAAQC,IACjC,GAA+B,OAA3BiM,EAAOjM,GAAGqM,OAAO,EAAG,GACtB,OAAOJ,EAAOjM,EAGpB,CA5CesM,CAAaT,IAEnBC,EACH,MAAM,IAAI7L,MAAM,wCAEpB,CACA,MAAM4K,EAASe,EAAa,EAGtBjB,EAAWqB,EAAkBlE,EAAUgE,EAAUjB,GAEvD,IAAkB,IAAdF,IAAoBa,EACtB,MAAM,IAAIvL,MAAM,qDAYlB,OATA8L,IA+BK,SAAyBE,GAC9B,IAAK,IAAIjM,EAAI,EAAGA,EAAIiM,EAAOlM,OAAQC,IACjC,GAAgC,kBAA5BiM,EAAOjM,GAAGqM,OAAO,EAAG,IACtB,OAAOJ,EAAOjM,GAAGqM,OAAO,IAAIE,MAGlC,CArC2BC,CAAgBX,GAEzCpE,EAAQmE,WAAaA,EACrBnE,EAAQqE,SAAWA,EACnBrE,EAAQoE,gBAAkBA,EAC1BpE,EAAQsE,qBAAuBA,EAC/BtE,EAAQ+D,WAA0B,IAAdb,EAGb,CACLW,YAAaS,EAGbU,aAAcjB,IAA2B,IAAdb,EAC3BiB,aACAC,kBACAC,WACAC,uBAEApJ,UAAW4I,EAAwBmB,MAAM7B,EAAQF,EAAW,GAEhE,CCjFA,MAAQQ,mBAAkBA,GAAKC,EAAAA,MAGxB,SAASuB,EACdC,EACAC,GAAO,GAEP,OAAKA,EAIHD,EAAgBnB,oBAAsBN,EAAmBQ,gBAHlDR,EAAmBO,aAK9B,CCLA,MAAM,oBAAEoB,GAAwBC,EAAAA,UAYjB,SAASC,EACtB/F,EACA1E,EACA8F,EAAyC,CAAC,EAC1CZ,EAA0C,CAAC,GAE3C,MAAMwF,EAAgB7E,KAChB,gBACJwE,EAAkB,CAAC,EAA+B,cAClDM,EAAgB,CAAC,GACfzF,EAGE0F,EAAeP,EAAgBO,cAAgB,OAU/CC,EAAe,IAAIN,EAAoB,iBA4F7C,OA3FAM,EAAaC,UAASC,MAAOC,EAAU1E,KACrC,MAAMC,EAAoBmE,EAAcrF,aACtC,KACAX,EACAoB,EACA,CAAC,GAEGW,EAAU3K,OAAO8J,OAAO,CAAC,EAAGE,EAAgBS,GAElDzK,OAAO4K,KAAKD,GAASE,SAAQ,SAAU/K,GAChB,OAAjB6K,EAAQ7K,KACV6K,EAAQ7K,QAAOL,GAEL,WAARK,IAAgD,IAA5B8I,EAAID,QAAQ,aAClCgC,EAAQ7K,QAAOL,EAEnB,IAEA,IACE,MAAMgK,QAAiB0F,MAAMvG,EAAK,CAChC+B,UACAyE,YAAQ3P,IAIV,GAAwB,MAApBgK,EAASY,OACX,MAAM,IAAIzI,MACR,qBAAqBgH,gBAAkBa,EAASY,UAGpD,MAAMgF,EAAiB5F,EAAS6F,KAAKC,YAC/B/B,EAAkB/D,EAASkB,QAE3BsC,EAAcO,EAAgBrN,IAAI,gBAElCqP,EAAaC,OAAOjC,EAAgBrN,IAAI,mBAE9C,IAAIuP,GAAW,EACXC,EAAcd,EAAcc,YAE5BC,EAAWf,EAAce,UAAY,EAIzC,IAFAf,EAAc1B,WAAY,GAElBuC,GAAU,CAChB,MAAM,KAAElB,EAAI,MAAEvN,SAAgBoO,EAAeQ,OAE7C,GADAF,EAAcG,EAAYH,EAAa1O,IAClC0O,EAAa,CAChB,GAAID,EACF,MAAM,IAAI9N,MAAM,qCAAqCsC,KAEvD,QACF,CAEA,GADAwL,EAAWlB,GAAQmB,EAAYI,aAAeP,GACzCE,GAAYC,EAAYjO,OAASkO,EAAWd,EAC/C,SAEFc,EAAWD,EAAYjO,OAEvBmN,EAAc1B,WAAaqB,EAC3B,MAAMwB,EAAYhD,EAChBC,EACA0C,EACAd,GAEIzB,EAAqBkB,EACzBC,EACAmB,GAEIO,EAAS,CACbrH,MACA1E,aACG8L,EACHnE,gBAAiB2C,EACb,IAC+B,IAA9BwB,EAAU1L,WAAW5C,OAAgB8N,EAC1CpC,qBACAoB,KAAMkB,GAKRR,EAASgB,IAAID,EAAQP,EACvB,CACF,CAAE,MAAOS,GA7FeA,MACxB,GAA8C,mBAAnCvB,EAAc1E,iBAAiC,CACxD,MAAMC,EAAQ,IAAIvI,MAAM,kBACxBgN,EAAc1E,iBAAiBC,EACjC,GA0FED,GACAkG,QAAQjG,MAAMgG,GACd3F,EAAO2F,EACT,KAGKpB,EAAasB,gBACtB,CAEA,SAASP,EAAYQ,EAAsBC,GAEzC,IAAKD,EACH,OAAOC,EAET,IAAKA,EACH,OAAOD,EAET,MAAME,EAAe,IAAI9D,WAAW4D,EAAS5O,OAAS6O,EAAM7O,QAG5D,OAFA8O,EAAa/N,IAAI6N,EAAU,GAC3BE,EAAa/N,IAAI8N,EAAOD,EAAS5O,QAC1B8O,CACT,CCrJA,MAAMC,EAAW,CACfC,WAAU,EACV/B,cAAa,EACb/E,WAAU,EACVG,WAAUA,GCsBZ,SAAS4G,EAAsBhL,GAS7B,IASIiL,EATAzL,EAAU0L,EAAAA,WAAuBlL,EAAW,CAC9CmL,SAAU,cAGP3L,EAAQE,SAAS0L,WACpBX,QAAQY,KAAK,yBAMf,IAOEJ,EAAeC,EAAAA,WAAuBlL,EAExC,CAAE,MAAOwK,GAGPC,QAAQjG,MAAMgG,GACdC,QAAQa,IAAI,sBAAuBd,EAAIhL,SACvCyL,EAAeT,EAAIhL,OACrB,CAQA,OAJAA,EAAQE,SAAS0L,UAAYH,EAAavL,SAAS0L,UAEnD5L,EAhEF,SAAsBA,GAIpB,MAAM+L,EAAY/L,EAAQE,SAAS0L,UAAUG,UACvCC,EAAchM,EAAQQ,UAAUjE,OAEtC,IAAK,MAAM0P,KAAYF,EAAW,CAChC,MAAM,SAAEG,EAAQ,OAAE3P,GAAW0P,EAEzB1P,EAASyP,EAAcE,IACzBjB,QAAQa,IACN,qDACEG,EAAS1P,aACJyP,EAAcE,KAEvBD,EAAS1P,OAASyP,EAAcE,EAEpC,CAEA,OAAOlM,CACT,CA2CYmM,CAAanM,GAEhBA,CACT,CAEe8J,eAAesC,EAC5B5L,EACA6L,EACAC,GAMA,MAAMtM,EACJwL,EAAsBhL,IAClB,IAAE+L,EAAG,QAAExN,EAAO,gBAAEyN,GAAoBF,EAuC1C,OApCAtM,EAAQyM,UAAY3C,eAAgB4C,GAGlC,MAAMC,EAAW9R,OAAO8J,OACtB,CACE4H,MACAxN,UACA6N,cAAepM,EAAUjE,OACzBsQ,cAAeL,EAAkBhM,EAAUjE,QAE7CmQ,IAEI,cAAEE,EAAa,cAAEC,GAAkBF,GAOnC,YAAEG,SAAsBT,EAAYE,EAAKxN,EAAS,CACtDgO,UAAW,GAAGH,KAAiBA,EAAgBC,MAI3CG,EAAoB,IAAIzF,WAAWuF,GACnCG,EAAoB,IAAI1F,WAC5BvH,EAAQQ,UAAUjE,OAASyQ,EAAkBzQ,QAO/C,OAJA0Q,EAAkB3P,IAAI0C,EAAQQ,WAC9ByM,EAAkB3P,IAAI0P,EAAmBhN,EAAQQ,UAAUjE,QAGpD6P,EAA0Ba,EAAmBZ,EAAaC,EACnE,EAEOtM,CACT,CCjGA,SAASkN,EACPC,EACAC,EACAC,GAEA,MAAMC,EAAS,CAAC,GAEfF,EACGvS,OAAOsI,OAAOiK,EAA+B5K,MAAM,GAAGxC,QAAQE,UAC9D,IAGDqN,KAAKC,GAAaF,EAAOE,EAAGvN,KAAOuN,IAEtC,MAAMC,EAAW,CAAC,EAWlB,OATCN,EACGtS,OAAOsI,OACLgK,EAAiC3K,MAAM6K,EAAc,GAAGrN,QAAQE,UAElE,IAGDqN,KAAKC,GAAaC,EAASD,EAAGvN,KAAOuN,IAEjC,CACLF,SACAG,WAEJ,CAEA,SAASC,EAAyB1N,GAChC,IAAKA,EACH,OAEF,MAAM,SAAEE,KAAayN,GAAqB3N,GAExC4N,UAAWT,EACXU,UAAWT,KACRU,GACD5N,EAIJ,MAAO,CACL6N,eAHqB/N,EAAQgO,UAAU,aAIvCb,mCACAC,iCACAU,gBACAH,mBAEJ,CC/EA,IAAIM,EACF,CAAC,ECDH,SAASC,EAAK3B,GACZ,GAAK0B,EAAe1B,GAIpB,OAAO0B,EAAe1B,EACxB,CAQA,SAAS4B,EAAqBnO,GAE5B,IAAKA,EACH,OAAO,EAGT,MAAMoO,EAAiBpO,EAAQgO,UAAU,aAEzC,OAAOI,GAAkBA,EAAiB,CAC5C,CA6CA,SACEF,OACAG,2BArBF,SAAoC9B,GAClC,MAAM+B,EAAe,GAEftO,EAAUkO,EAAK3B,GAErB,GAAI4B,EAAqBnO,GAAU,CAEjC,MAAMoO,EAAkBpO,EAAgBgO,UAAU,aAElD,IAAK,IAAIxR,EAAI,EAAGA,GAAK4R,EAAgB5R,IACnC8R,EAAa5L,KAAK,GAAG6J,WAAa/P,IAEtC,MACE8R,EAAa5L,KAAK6J,GAGpB,OAAO+B,CACT,EAKEC,0BA1CF,SAAmChC,GACjC,MAAMiC,EALR,SAAqCjC,GACnC,OAAOA,EAAI/I,QAAQ,UACrB,CAG8BiL,CAA4BlC,GAClDmC,GACqB,IAAzBF,EAA6BjC,EAAMA,EAAIrD,MAAM,EAAGsF,GAC5C5K,EAAQE,SAASyI,EAAIrD,MAAMsF,EAAsB,GAAI,KAAO,EAElE,IAAIxO,EAQJ,OALEA,EADEiO,EAAeS,GACPT,EAAeS,GAAe1O,aAE9B1F,EAGL,CACL0F,UACA4D,QAEJ,EAyBE+K,oBAhEF,SAA6BpC,GAG3B,OAAO4B,EAFSD,EAAK3B,GAGvB,GCeA,IAAIqC,EAAmB,EAEnBC,EAA+D,CAAC,EA4K7D,SAASC,IACd,MAAO,CACLF,mBACAG,uBAAwBlU,OAAO4K,KAAKwI,GAAgB1R,OAExD,CASA,SACEyS,SAxLF,SAAkBzC,GAChB,YAA+BjS,IAAxB2T,EAAe1B,EACxB,EAuLE0C,KAjJF,SACE1C,EACAF,EAAmCd,EACnCxM,GAGA,GAAIkP,EAAe1B,GAEjB,OAAO,IAAI5N,SAASC,IAClBqP,EAAe1B,GAAK2C,aACpBtQ,EAAQqP,EAAe1B,GAAKvM,QAAQ,IAKxC,GAAI6O,EAAStC,GAIX,OAFAsC,EAAStC,GAAK2C,aAEPL,EAAStC,GAIlB,MAAM4C,EAAmB9C,EAAYE,EAAKxN,GAGpCqG,EAA8C,IAAIzG,SACtD,CAACC,EAASyG,KACR8J,EAEGnQ,MAAK8K,eAAgBsF,GACpB,MAAMC,EAAiB,CACrBC,kBAAkB,EAClB9C,gBAAiB,MAKnB,KAAM4C,aAAoCG,aAAc,CACtD,IAAKH,EAAyBtC,YAC5B,OAAOzH,EACL,IAAI5I,MACF,kFAIN4S,EAAeC,iBACbF,EAAyBI,MAAMF,iBACjCD,EAAe7C,gBACb4C,EAAyBI,MAAMhD,gBACjC4C,EAA2BA,EAAyBtC,WACtD,CAEA,MAAMtM,EAAY,IAAI+G,WAAW6H,GAGjC,IAAIpP,EAEJ,IAGIA,EAFEqP,EAAeC,uBAEDlD,EACd5L,EACA6L,EACA,CACEE,MACAxN,UACAyN,gBAAiB6C,EAAe7C,kBAI1Bd,EAAAA,WAAuBlL,EAErC,CAAE,MAAOwE,GACP,OAAOK,EAAOL,EAChB,CAEAiJ,EAAe1B,GAAO,CACpBvM,UACAkP,WAAY9J,EAAQ8J,YAEtBN,GAAoB5O,EAAQQ,UAAUjE,OACtCqC,EAAQoB,IAERgG,EAAAA,EAAAA,cAAaC,EAAAA,YAAa,uBAAwB,CAChDsG,MACAkD,OAAQ,SACRC,UAAWZ,KAEf,GAAGzJ,GACFrG,MACC,YAES6P,EAAStC,EAAI,IAEtB,YAESsC,EAAStC,EAAI,GAEvB,IAQP,OAJAnH,EAAQ8J,WAAa,EAErBL,EAAStC,GAAOnH,EAETA,CACT,EAsCEuK,OAnCF,SAAgBpD,GAEV0B,EAAe1B,KACjB0B,EAAe1B,GAAK2C,aACmB,IAAnCjB,EAAe1B,GAAK2C,aAEtBN,GAAoBX,EAAe1B,GAAKvM,QAAQQ,UAAUjE,cACnD0R,EAAe1B,IAEtBvG,EAAAA,EAAAA,cAAaC,EAAAA,YAAa,uBAAwB,CAChDsG,MACAkD,OAAQ,WACRC,UAAWZ,OAInB,EAoBEA,UACAc,MAXF,WF7ME3B,EAAiB,CAAC,EE+MlBY,EAAW,CAAC,EACZD,EAAmB,CACrB,EAQE5T,IAzLF,SAAauR,GACX,IAAIvM,EAEJ,GAAIuM,EAAIsD,SAAS,WAAY,CAC3B,MAAM,MAAEjM,EAAO5D,QAAS8P,GACtBC,EAAAA,0BAA4CxD,GAE9CvM,EHwCJ,SAAqCqN,EAAarN,GAChD,IAAKA,EACH,OAGF,MAAM,eACJ+N,EAAc,iCACdZ,EAAgC,+BAChCC,EAA8B,cAC9BU,GACEJ,EAAyB1N,GAE7B,GAAImN,GAAoCY,EAAiB,EAAG,CAC1D,MAAM,OAAET,EAAM,SAAEG,GAAaP,EAC3BC,EACAC,EACAC,GAII2C,EAAc,CAClB9P,SAAU,IACL4N,KACAR,KACAG,IAIDwC,EAAgBpV,OAAOqV,OAAOlQ,GAGpC,OAFmBnF,OAAO8J,OAAOsL,EAAeD,EAGlD,CAEA,OAAOhQ,CACT,CG3EcmQ,CAA4BvM,EAAOkM,EAC/C,MAAW7B,EAAe1B,KACxBvM,EAAUiO,EAAe1B,GAAKvM,SAGhC,OAAOA,CACT,EA6KEoQ,OA3KF,SAAgB7D,EAAavM,GAC3B,MAAMqQ,EAAgBpC,EAAe1B,GAEhC8D,GAMLzB,GAAoByB,EAAcrQ,QAAQQ,UAAUjE,OACpD8T,EAAcrQ,QAAUA,EACxB4O,GAAoB5O,EAAQQ,UAAUjE,QAEtCyJ,EAAAA,EAAAA,cAAaC,EAAAA,YAAa,uBAAwB,CAChDsG,MACAkD,OAAQ,UACRC,UAAWZ,OAZX7D,QAAQjG,MAAM,6BAA6BuH,IAc/C,GCvEe,SAAS+D,EAAoBC,GAC1C,MAAwB,eAAjBA,GAAkD,qBAAjBA,CAC1C,CCMA,SAASC,EAA+BxQ,EAASyQ,GAC/C,MAAMC,EAAY1Q,EAAQa,OAAO,aAEjC,GAAI6P,EAAW,CACb,MAAMC,EAAWD,EAAUrN,MAAM,MAEjC,GAAIsN,EAASpU,OAASkU,EACpB,OAAOE,EAASF,EAEpB,CAGF,CA8DA,SAASG,EAA8B5Q,GACrC,IAAI6Q,EAA0BC,EAAgB9Q,EAAS,YAAa,GAoBpE,OAjBK6Q,GAA2B7Q,EAAQE,SAAS6Q,YAC/CF,EAA0BC,EACxB9Q,EAAQE,SAAS6Q,UAAUvO,MAAM,GAAGxC,QACpC,YACA,IAQC6Q,IACHA,EAxEJ,SAAmD7Q,GACjD,IAAI6Q,EACJ,MAAMG,EAAWhR,EAAQa,OAAO,aAEhC,GAAImQ,GAAUnB,SAAS,MAAO,CAC5B,MAAMU,EAAeC,EAA+BxQ,EAAS,GAEzDuQ,GAAgBD,EAAoBC,IAClCvQ,EAAQE,SAAS+Q,YACnBJ,EAA0BC,EACxB9Q,EAAQE,SAAS+Q,UAAUzO,MAAM,GAAGxC,QACpC,YACA,GAIR,CAEA,OAAO6Q,CACT,CAsDMK,CAA0ClR,IAGvC6Q,CACT,CASA,SAASM,EAA2BnR,GAClC,IAAIoR,EAAuBN,EAAgB9Q,EAAS,YAAa,GAiBjE,OAdKoR,GAAwBpR,EAAQE,SAASmR,YAC5CD,EAAuBN,EACrB9Q,EAAQE,SAASmR,UAAU7O,MAAM,GAAGxC,QACpC,YACA,IAMCoR,IACHA,EA1EJ,SAAgDpR,GAC9C,IAAIoR,EACJ,MAAMJ,EAAWhR,EAAQa,OAAO,aAEhC,GAAImQ,GAAUnB,SAAS,MAAO,CAC5B,MAAMU,EAAeC,EAA+BxQ,EAAS,GAEzDuQ,GAAgBD,EAAoBC,IAClCvQ,EAAQE,SAAS+Q,YACnBG,EAAuBN,EACrB9Q,EAAQE,SAAS+Q,UAAUzO,MAAM,GAAGxC,QACpC,YACA,GAIR,CAEA,OAAOoR,CACT,CAuD2BE,CAAuCtR,IAGzDoR,CACT,CAQA,SAASG,EAA0BvR,GACjC,IAAIwR,EAAeV,EAAgB9Q,EAAS,YAAa,GAYzD,OARKwR,GAAgBxR,EAAQE,SAASuR,YACpCD,EAAeV,EACb9Q,EAAQE,SAASuR,UAAUjP,MAAM,GAAGxC,QACpC,YACA,IAIGwR,CACT,CAQA,SAASE,EAAiC1R,GACxC,IAAI2R,EAaJ,OAXI3R,EAAQE,SAAS0R,UACnBD,EAAiB3R,EAAQ6C,YAAY,aAErC7C,EAAQE,SAASuR,WACjBzR,EAAQE,SAASuR,UAAUjP,MAAMjG,QACjCyD,EAAQE,SAASuR,UAAUjP,MAAM,GAAGxC,QAAQE,SAAS0R,YAErDD,EACE3R,EAAQE,SAASuR,UAAUjP,MAAM,GAAGxC,QAAQ6C,YAAY,cAGrD8O,CACT,CC1KA,SAASE,EAAkB9S,EAAS+S,EAAkBC,GACpD,MAAMlT,EAAS,CAAC,EAChB,IAAK,MAAMmT,KAAKD,EACd,IACE,MAAMrT,EAAOoT,EAAiBE,EAAGjT,GACjC,GAAIL,EAAM,CACR,MAAMuT,EAAkB,CAAC,EACzB,IAAK,MAAMtX,KAAO+D,EAChB,GAAI/D,KAAO+D,EAAM,CAGfuT,EADuBC,EAAcvX,IACH+D,EAAK/D,EACzC,CAEFE,OAAO8J,OAAO9F,EAAQoT,EACxB,CACF,CAAE,MAAOjN,GACPiG,QAAQjG,MAAM,oBAAoBgN,UAAWhN,EAC/C,CAGF,OAAOnG,CACT,CAEA,MAAMqT,EAAiBjS,GACrBA,EAAIkS,OAAO,GAAGC,cAAgBnS,EAAIiJ,MAAM,GAEpCmJ,EAAsB,CAC1B,mBACA,sBACA,qBACA,mBACA,6BACA,mBACA,oBACA,eACA,kBACA,mBACA,qBACA,iBACA,kBACA,kBC1CF,SAASC,GAAqBhG,GAC5B,MAAMiG,EAAWjG,EAASpM,SAAoB,UAC9C,IAAKqS,IAAaA,EAAS/P,MACzB,MAAO,GA2CT,OAxCgB+P,EAAS/P,MAAM+K,KAAKiF,IAClC,MAAMC,EAAiBD,EAAKxS,QAAQ0S,OAAO,aACrCC,EAAiBH,EAAKxS,QAAQ0S,OAAO,aACrCE,EAA0BJ,EAAKxS,QAAQG,OAAO,aAC9C0S,EAA0BL,EAAKxS,QAAQG,OAAO,aAgBpD,MAAO,CACL2S,oBAf0BN,EAAKxS,QAAQG,OAAO,aAgB9C4S,oBAf0BP,EAAKxS,QAAQG,OAAO,aAgB9C6S,oBAf0BR,EAAKxS,QAAQG,OAAO,aAgB9C8S,oBAf0BT,EAAKxS,QAAQG,OAAO,aAgB9C+S,iBAfuBV,EAAKxS,QAAQmT,MAAM,cAAgB,KAgB1DC,iBAfuBZ,EAAKxS,QAAQmT,MAAM,cAAgB,KAgB1DV,iBACAE,iBACAC,0BACAC,0BACAQ,6BAlBmCb,EAAKxS,QAAQG,OAAO,aAmBvDmT,6BAlBmCd,EAAKxS,QAAQG,OAAO,aAmBvDoT,oBAlB0Bf,EAAKxS,QAAQG,OAAO,aAmB9CqT,eAjBqBhB,EAAKxS,QAAQG,OAAO,aAkBzCsT,YAjBkBjB,EAAKxS,QAAQG,OAAO,aAkBtCuT,oBAjB0BlB,EAAKxS,QAAQG,OAAO,aAkB/C,GAIL,CC5BA,SAAS2R,GAAiB6B,EAAM5U,GAC9B,MAAM,gBAAE6U,GAAoBhM,EAAAA,MAG5B,GAAIiM,MAAMC,QAAQ/U,GAChB,OAGF,MAAMgV,EAAgBC,EAAajV,GAEnC,GAAI4U,IAASC,EAAgBK,WAAY,CACvC,MAAMC,EAAiBnE,EAAAA,0BACrBgE,EAActQ,KAGhB,IAAKyQ,EAAelU,QAClB,OAGF,MAAMmU,ER5CV,SAAmCnU,EAAS4D,GAC1C,IAAK5D,EACH,OAGF,MAAM,eACJ+N,EAAc,iCACdZ,EAAgC,+BAChCC,GACEM,EAAyB1N,GAE7B,GAAImN,GAAoCY,EAAiB,EAAG,CAC1D,MAAM,OAAET,EAAM,SAAEG,GAAaP,EAC3BC,EACAC,EACAxJ,GAGF,MAAO,CACLmK,iBACAqG,8BAA+B3G,EAC/B4G,4BAA6B/G,EAEjC,CAEA,MAAO,CACLS,iBAEJ,CQgB2BuG,CACrBJ,EAAelU,QACfkU,EAAetQ,OAGjB,OAAOuQ,CACT,CAEA,IAAI1Q,EAAMsQ,EAActQ,IAEpBsQ,EAAcnQ,QAChBH,EAAM,GAAGA,WAAasQ,EAAcnQ,SAGtC,MAAM5D,EAAUuU,EAAoBvZ,IAAIyI,GAExC,OAAKzD,EAIEwU,GAAmBb,EAAM5U,EAASiB,QAJzC,CAKF,CAEO,SAASwU,GACdb,EACA5U,EACAiB,GAEA,MAAM,gBAAE4T,GAAoBhM,EAAAA,MAE5B,GAAI+L,IAASC,EAAgBa,cAC3B,MAAO,CACLC,iBAAkB1U,EAAQa,OAAO,aACjC8T,UAAWjJ,EAAAA,QAAoB1L,EAAQa,OAAO,cAC9C+T,UAAWlJ,EAAAA,QAAoB1L,EAAQa,OAAO,cAAgB,IAC9DgU,gBAAiB7U,EAAQa,OAAO,cAIpC,GAAI8S,IAASC,EAAgBkB,eAC3B,MAAO,CACL9D,SAAUhR,EAAQa,OAAO,aACzBkU,kBAAmB/U,EAAQa,OAAO,aAClCmU,aAAchV,EAAQgO,UAAU,aAChCiH,iBAAkBjV,EAAQa,OAAO,aACjCqU,WAAYxJ,EAAAA,QAAoB1L,EAAQa,OAAO,cAC/CsU,WAAYzJ,EAAAA,QAAoB1L,EAAQa,OAAO,cAAgB,IAC/DuU,gBAAiB1J,EAAAA,QAAoB1L,EAAQa,OAAO,cACpDwU,gBAAiB3J,EAAAA,QAAoB1L,EAAQa,OAAO,cAAgB,KAIxE,GAAI8S,IAASC,EAAgB0B,cAC3B,MAAO,CACLC,eAAgBvV,EAAQa,OAAO,aAC/B2U,eAAgBxV,EAAQgO,UAAU,aAClCyH,sBAAuBzV,EAAQa,OAAO,aACtC6U,2BAA4B1V,EAAQ6C,YAAY,aAChD8S,4BAA6B3V,EAAQa,OAAO,cAIhD,GAAI8S,IAASC,EAAgBgC,QAC3B,MAAO,CACLC,UAAW7V,EAAQa,OAAO,aAC1BiV,YAAa9V,EAAQa,OAAO,cAIhC,GAAI8S,IAASC,EAAgBmC,cAC3B,MAAO,CACLC,WAAYhW,EAAQgO,UAAU,aAC9BiI,YAAajW,EAAQ6C,YAAY,aACjCqT,WAAYlW,EAAQa,OAAO,aAC3BsV,cAAenW,EAAQ6C,YAAY,cAIvC,GAAI8Q,IAASC,EAAgBwC,uBAAwB,CACnD,MAAMpF,EAAWhR,EAAQa,OAAO,aAC1B0P,EAAeC,EAA+BxQ,EAAS,GAE7D,MAAO,CACLgR,WACAN,UAAW1Q,EAAQa,OAAO,aAC1B0P,eACAM,wBAAyBD,EAA8B5Q,GACvDoR,qBAAsBD,EAA2BnR,GACjD2R,eAAgBD,EAAiC1R,GACjDwR,aAAcD,EAA0BvR,GACxCoO,eAAgBpO,EAAQG,OAAO,aAC/BmQ,oBACEA,EAAoBC,IAAiBS,EAASnB,SAAS,MAE7D,CAEA,GAAI8D,IAASC,EAAgByC,YAAa,CACxC,MAAMxF,EAA0BD,EAA8B5Q,GACxDoR,EAAuBD,EAA2BnR,GAClDwR,EAAeD,EAA0BvR,GACzC2R,EAAiBD,EAAiC1R,GAExD,IAAIsW,EAAqB,KAErBC,EAAkB,KAElB/E,IACF+E,EAAkB/E,EAAa,GAC/B8E,EAAqB9E,EAAa,IAGpC,IAAIgF,EAAa,KAEbC,EAAgB,KAqBpB,OAnBI5F,IACF2F,EAAa,CAEXlT,WAAWuN,EAAwB,IAEnCvN,WAAWuN,EAAwB,IAEnCvN,WAAWuN,EAAwB,KAErC4F,EAAgB,CAEdnT,WAAWuN,EAAwB,IAEnCvN,WAAWuN,EAAwB,IAEnCvN,WAAWuN,EAAwB,MAIhC,CACL6F,oBAAqB1W,EAAQa,OAAO,aACpC3B,KAAMc,EAAQG,OAAO,aACrBlB,QAASe,EAAQG,OAAO,aACxB0Q,0BACA2F,aACAC,gBACArF,uBACAO,iBACAgF,cAAe3W,EAAQ6C,YAAY,aACnC2O,eACA+E,kBACAD,qBAEJ,CAEA,GAAI3C,IAASC,EAAgBgD,KAC3B,MAAO,CACLC,UAAW7W,EAAQ6C,YAAY,cAInC,GAAI8Q,IAASC,EAAgBkD,YAC3B,OAAOC,EAAoB/W,GAG7B,GAAI2T,IAASC,EAAgBoD,QAAS,CACpC,MAAMC,EACJC,EAAwClX,GAE1C,MAAO,CACLmX,aAAcrG,EAAgB9Q,EAAS,YAAa,GACpDoX,YAAatG,EAAgB9Q,EAAS,YAAa,GACnDqX,eAAgBC,EACdL,EACAjX,EAAQE,SAASqX,WAGvB,CAEA,GAAI5D,IAASC,EAAgB4D,aAC3B,MAAO,CACL5U,iBAAkB5C,EAAQ6C,YAAY,aACtCC,aAAc9C,EAAQ6C,YAAY,aAClC4U,YAAazX,EAAQa,OAAO,aAC5B6W,oBAAqBJ,EACnBtX,EAAQG,OAAO,aACfH,EAAQE,SAAS+C,YAKvB,GAAI0Q,IAASC,EAAgB+D,WAC3B,MAAO,CACLhV,YAAa3C,EAAQa,OAAO,aAC5B0U,eAAgBvV,EAAQa,OAAO,cAInC,GAAI8S,IAASC,EAAgBgE,YAAa,CACxC,MAAMC,EAA0B7X,EAAQE,SAAS4X,UAEjD,QAAgCxd,IAA5Bud,EACF,OAGF,MAAME,EACJF,EAAwBrV,MAAM,GAAGxC,QAEnC,MAAO,CACL6X,wBAAyB,CACvBG,6BAA8BtM,EAAAA,QAC5BqM,EAAoClX,OAAO,cAAgB,IAE7DoX,sBACEF,EAAoClV,YAAY,aAClDqV,qBACEH,EAAoClV,YAAY,cAGxD,CAEA,GAAI8Q,IAASC,EAAgBuE,cAC3B,OCnQW,SAA+BnY,GAC5C,MAAMoY,EAAW,GAEjB,IAAK,IAAIC,EAAe,EAAMA,GAAgB,GAAMA,GAAgB,EAAM,CACxE,IAAIC,EAAW,MAAMD,EAAaE,SAAS,MAEnB,IAApBD,EAAS/b,SACX+b,EAAW,OAAOD,EAAaE,SAAS,OAG1C,MAAM7Z,EAAOsB,EAAQE,SAAS,GAAGoY,SAEjC,IAAK5Z,EACH,SAGF,MAAMS,EAAY,GAElB,IAAK,IAAI3C,EAAI,EAAGA,EAAIkC,EAAKnC,OAAQC,IAC/B,IAAK,IAAIgc,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMC,EAAczY,EAAQQ,UAAU9B,EAAK+B,WAAajE,GAExD2C,EAAc,EAAJ3C,EAAQgc,GAAMC,GAAeD,EAAK,CAC9C,CAGFJ,EAAS1V,KAAK,CACZxD,KAAMc,EAAQG,OAAO,GAAGmY,SACxBrZ,QAASe,EAAQG,OAAO,GAAGmY,SAC3B3E,KAAM3T,EAAQa,OAAO,GAAGyX,SACxBI,EAAG1Y,EAAQsB,MAAM,GAAGgX,QAAgB,GAAK,EACzC3a,EAAGqC,EAAQsB,MAAM,GAAGgX,QAAgB,GAAK,EACzCnZ,YACAwZ,YAAa3Y,EAAQa,OAAO,GAAGyX,SAC/BM,MAAO5Y,EAAQa,OAAO,GAAGyX,SACzBO,QAAS7Y,EAAQa,OAAO,GAAGyX,SAC3BQ,QAAS9Y,EAAQa,OAAO,GAAGyX,SAC3BS,qBAAsB/Y,EAAQa,OAAO,GAAGyX,UAE5C,CAEA,MAAO,CACLF,WAEJ,CDuNWY,CAAsBhZ,GAK/B,GAAa,mBAAT2T,EAA2B,CAC7B,IAAIsF,EAEJ,IACEA,EAAoBjZ,EAAQa,OAAO,YACrC,CAAE,MAAOmE,GACP,CAGF,MAAO,CACLiU,oBAEJ,CAEA,GAAItF,IAASC,EAAgBsF,WAC3B,MAAO,CACLC,eAAgBnZ,EAAQa,OAAO,aAC/BuY,MAAOpZ,EAAQa,OAAO,aACtBwY,gBAAiBrZ,EAAQa,OAAO,cAIpC,GAAI8S,IAASC,EAAgB0F,UAC3B,MAAO,CACLC,mBAAoBvZ,EAAQ6C,YAC1B7C,EAAQa,OAAO,cAAgB,IAEjC2Y,oBAAqBxZ,EAAQgO,UAAUhO,EAAQa,OAAO,eAI1D,GAAI8S,IAASC,EAAgB6F,2BAC3B,OAAOnH,GAAqBtS,GAG9B,GAAI2T,IAASC,EAAgB8F,YAAa,CAExC,GAAiB,OADA1Z,EAAQa,OAAO,aACT,CAErB,MAAO,CACL8Y,4BAFqBrH,GAAqBtS,GAI9C,CACF,CAGA,MAAa,aAAT2T,EACK9B,EAAkB9S,EAAS+S,GAAkBO,QADtD,CAGF,CAEA,YE7TA,IAAIuH,GAAgB,GAoBpB,UACE7O,IAnBF,SAAa8O,GAGX,MAAO,cAFWD,GAAMlX,KAAKmX,GAEG,EAClC,EAgBE7e,IAdF,SAAayV,GACX,OAAOmJ,GAAMnJ,EACf,EAaEqJ,OAXF,SAAgBrJ,GACdmJ,GAAMnJ,QAASnW,CACjB,EAUEsV,MARF,WACEgK,GAAQ,EACV,GCAe,SAASG,GACtB/Z,EACA2D,GAEA,GACE3D,EAAQE,SAAS0L,WACjB5L,EAAQE,SAAS0L,UAAUoO,iBAAiBzd,OAG5C,OAAO0d,EAAAA,EAAAA,4BACLja,EACAA,EAAQE,SAAS0L,UACjBjI,GAMJ,GAzBF,SAA6B3D,GAI3B,OAHuBA,EAAQgO,UAAU,eAChBhO,EAAQE,SAAS0L,UAECG,UAAUxP,MACvD,CAoBM2d,CAAoBla,GAAU,CAChC,MAAMga,GAAmBG,EAAAA,EAAAA,4BACvBna,EACAA,EAAQE,SAAS0L,WAGnB,OAAOqO,EAAAA,EAAAA,4BACLja,EACAA,EAAQE,SAAS0L,UACjBjI,EACAqW,EAEJ,CAUA,MAAMjO,EAAY/L,EAAQE,SAAS0L,UAAUG,UAGvCqO,EAAa,IAAIC,EAAAA,WACrBra,EAAQsa,gBACRta,EAAQQ,UACRR,EAAQE,SAAS0L,UAAUnL,YAIvBuZ,GAAmBO,EAAAA,EAAAA,kBAAiBH,GAE1C,GAA6B,cAAzBJ,EAAiB/Z,IACnB,KAAM,8EAGRma,EAAWI,KAAKR,EAAiBzd,QAEjC,MAAMke,EAAuBL,EAAWlO,SAKxC,GAAIvI,EAAa,EAAIoI,EAAUxP,OAC7B,KAAM,2EAGR,MACMme,EACJD,EAAuB1O,EAAUpI,GAAY0D,OAFpB,EAGrB9K,EAASwP,EAAUpI,GAAYpH,OAMrC,OAAO,IAAIgL,WACT6S,EAAW5Z,UAAUma,OAAOzR,MAC1BkR,EAAW5Z,UAAUka,WAAaA,EAClCN,EAAW5Z,UAAUka,WAAaA,EAAane,GAGrD,CChGA,SAASqe,GAASC,EAAcC,GAC9B,OAAOD,EAAQ,GAAKC,CACtB,CA8BA,SAzBA,SACEta,EACAua,EACAC,GAGA,MAAM7b,EAAY,IAAIoI,WAAWyT,GAEjC,IAAK,IAAIxe,EAAI,EAAGA,EAAIwe,EAAgBxe,IAAK,CAEvC,MAGMqe,EAAOra,EAHGoG,KAAKqU,MAAMze,EAAI,GAGEue,GAG3BD,EAASte,EAAI,EAGnB2C,EAAU3C,GAAKoe,GAASC,EAAMC,GAAU,EAAI,CAC9C,CAEA,OAAO3b,CACT,EC+DA,SA1FA,SACEa,EACA2D,GAEA,MAAMuX,EACJlb,EAAQE,SAAS0L,WAAa5L,EAAQE,SAASib,UAC3Cra,EAAgBd,EAAQG,OAAO,aAC/BjB,EAAOc,EAAQG,OAAO,aACtBlB,EAAUe,EAAQG,OAAO,aAE/B,IAAIQ,EAAkBX,EAAQG,OAAO,aAsBH,iBAFAH,EAAQa,OAAO,eAG/CF,EAAkB,EAClBsK,QAAQY,KACN,+LAKJ,MAAMuP,EAAkBF,EAAiBza,WACnCua,EAAiB9b,EAAOD,EAAU0B,EAExC,IAAIoa,EAEJ,GAAsB,IAAlBja,EAAqB,CAEvB,GADAia,EAAcK,EAAkBzX,EAAaqX,EACzCD,GAAe/a,EAAQQ,UAAUjE,OACnC,MAAM,IAAIE,MAAM,mCAGlB,OAAO,IAAI8K,WACTvH,EAAQQ,UAAUma,OAAOzR,MAAM6R,EAAaA,EAAcC,GAE9D,CAAO,GAAsB,KAAlBla,EAAsB,CAE/B,GADAia,EAAcK,EAAkBzX,EAAaqX,EAAiB,EAC1DD,GAAe/a,EAAQQ,UAAUjE,OACnC,MAAM,IAAIE,MAAM,mCAGlB,OAAO,IAAI8K,WACTvH,EAAQQ,UAAUma,OAAOzR,MACvB6R,EACAA,EAA+B,EAAjBC,GAGpB,CAAO,GAAsB,IAAlBla,EAAqB,CAE9B,GADAia,EAAcK,EAAkBzX,EAAaqX,EAAiB,KAC1DD,GAAe/a,EAAQQ,UAAUjE,OACnC,MAAM,IAAIE,MAAM,mCAGlB,OAAO4e,GAAkBrb,EAAQQ,UAAWua,EAAaC,EAC3D,CAAO,GAAsB,KAAlBla,EAAsB,CAE/B,GADAia,EAAcK,EAAkBzX,EAAaqX,EAAiB,EAC1DD,GAAe/a,EAAQQ,UAAUjE,OACnC,MAAM,IAAIE,MAAM,mCAGlB,OAAO,IAAI8K,WACTvH,EAAQQ,UAAUma,OAAOzR,MACvB6R,EACAA,EAA+B,EAAjBC,GAGpB,CAEA,MAAM,IAAIve,MAAM,2BAClB,ECxEA,SApBA,SAAyB8P,GACvB,MAAMwH,EAAgBC,EAAazH,GAC7B+O,EAAYxX,SAASiQ,EAActQ,IAAK,IACxCoW,EAAO0B,GAAYvgB,IAAIsgB,GAE7B,OAAO,IAAI3c,SAAqB,CAACC,EAASyG,KACxC,MAAMmW,EAAa,IAAIC,WAEvBD,EAAWE,OAAUtgB,IACnB,MAAMgU,EAA2BhU,EAAEugB,OAAO9c,OAE1CD,EAAQwQ,EAAyB,EAGnCoM,EAAW1U,QAAUzB,EAErBmW,EAAWI,kBAAkB/B,EAAK,GAEtC,ECFA,SAfA,SAAsB7Z,EAAkB2D,EAAa,GACnD,MAAMuX,EACJlb,EAAQE,SAAS0L,WAAa5L,EAAQE,SAASib,UAEjD,OAAKD,EAIDA,EAAiBW,sBACZ9B,GAA0B/Z,EAAS2D,GAGrCmY,GAA0B9b,EAAS2D,GAPjC,IAQX,ECiBA,SA1BA,SAAmBoY,GAOjB,IAIIC,EAJAC,EAAMF,EAAgB,GAEtBG,EAAMH,EAAgB,GAG1B,MAAM5e,EAAY4e,EAAgBxf,OAElC,IAAK,IAAIkU,EAAQ,EAAGA,EAAQtT,EAAWsT,IACrCuL,EAAcD,EAAgBtL,GAC9BwL,EAAMrV,KAAKqV,IAAIA,EAAKD,GACpBE,EAAMtV,KAAKsV,IAAIA,EAAKF,GAGtB,MAAO,CACLC,MACAC,MAEJ,ECvBA,SAASC,GAAWnf,EAAYC,EAAaC,GACJ,IAAnCF,EAAWkE,oBACbkb,EAAuBpf,EAAWmC,UAAWlC,EAAaC,GAE1Dmf,EAAuBrf,EAAWmC,UAAWlC,EAAaC,EAE9D,CAUe,SAASof,GAAkBtf,EAAYC,EAAaC,GAEjE,GAA6C,QAAzCF,EAAW4D,0BACbub,GAAWnf,EAAYC,EAAaC,QAC/B,GAA6C,YAAzCF,EAAW4D,0BACpBub,GAAWnf,EAAYC,EAAaC,QAC/B,GAA6C,YAAzCF,EAAW4D,0BACpBub,GAAWnf,EAAYC,EAAaC,QAC/B,GAA6C,kBAAzCF,EAAW4D,0BACpB2b,EAAoBvf,EAAYC,EAAaC,QACxC,GAA6C,iBAAzCF,EAAW4D,2BCjCT,SACb5D,EACAC,EACAC,GAEA,QAAmB5C,IAAf0C,EACF,MAAM,IAAIP,MAAM,uDAElB,GAAIO,EAAWT,OAAS,GAAM,EAC5B,MAAM,IAAIE,MACR,8CAA8CO,EAAWT,iCAI7D,MAAMY,EAAYH,EAAWT,OAAS,EAEtC,IAAImB,EAAW,EAEXL,EAAc,EAElB,GAAIH,EACF,IAAK,IAAIV,EAAI,EAAGA,EAAIW,EAAWX,GAAK,EAAG,CACrC,MAAMggB,EAAKxf,EAAWU,KAChB+e,EAAKzf,EAAWU,KAChBE,EAAKZ,EAAWU,KAChBG,EAAKb,EAAWU,KAEtBT,EAAYI,KAAiBmf,EAAK,OAAS3e,EAAK,KAChDZ,EAAYI,KACVmf,EAAK,QAAW5e,EAAK,KAAO,QAAWC,EAAK,KAC9CZ,EAAYI,KAAiBmf,EAAK,OAAS5e,EAAK,KAChDX,EAAYI,KAAiB,IAE7BJ,EAAYI,KAAiBof,EAAK,OAAS5e,EAAK,KAChDZ,EAAYI,KACVof,EAAK,QAAW7e,EAAK,KAAO,QAAWC,EAAK,KAC9CZ,EAAYI,KAAiBof,EAAK,OAAS7e,EAAK,KAChDX,EAAYI,KAAiB,GAC/B,MAKF,IAAK,IAAIb,EAAI,EAAGA,EAAIW,EAAWX,GAAK,EAAG,CACrC,MAAMggB,EAAKxf,EAAWU,KAChB+e,EAAKzf,EAAWU,KAChBE,EAAKZ,EAAWU,KAChBG,EAAKb,EAAWU,KAEtBT,EAAYI,KAAiBmf,EAAK,OAAS3e,EAAK,KAChDZ,EAAYI,KACVmf,EAAK,QAAW5e,EAAK,KAAO,QAAWC,EAAK,KAC9CZ,EAAYI,KAAiBmf,EAAK,OAAS5e,EAAK,KAEhDX,EAAYI,KAAiBof,EAAK,OAAS5e,EAAK,KAChDZ,EAAYI,KACVof,EAAK,QAAW7e,EAAK,KAAO,QAAWC,EAAK,KAC9CZ,EAAYI,KAAiBof,EAAK,OAAS7e,EAAK,IAClD,CACF,CDzBI8e,CAAyB1f,EAAWmC,UAAWlC,EAAaC,OACvD,IAA6C,aAAzCF,EAAW4D,0BAIpB,MAAM,IAAInE,MACR,4DAA4DO,EAAW4D,8BAzB7E,SAAwB5D,EAAYC,EAAaC,GACR,IAAnCF,EAAWkE,oBACbyb,EAAsB3f,EAAWmC,UAAWlC,EAAaC,GAEzD0f,EAAsB5f,EAAWmC,UAAWlC,EAAaC,EAE7D,CAeI2f,CAAe7f,EAAYC,EAAaC,EAM1C,CACF,CErCA,SAAS4f,GAAoBnC,GAC3B,OAQF,SAAwBoC,GACtB,IAAI/X,EAEJ,IACE,OAAOgY,mBAAmBC,OAAOF,GACnC,CAAE,MAAOG,GAEP,GADAlY,EAAQkY,EACJlY,aAAiBmY,SACnB,OAAOJ,EAET,MAAM/X,CACR,CACF,CApBSoY,CACL1U,OAAOC,aAAa0U,MAClB,KACAxJ,MAAMrY,UAAU0N,MAAMmU,MAAM,IAAI9V,WAAWoT,KAGjD,CAsFA,SAtEA,SACE3d,EACAmC,EACAme,GAEA,MAAM5d,GAAQ,IAAI6d,MAAOC,UACnBC,EAAU,IAAIC,KAAK,CAACve,GAAY,CAAEwU,KAAM,eAE9C,OAAO,IAAIhV,SAAQ,CAACC,EAASyG,KAC3B,MAAMmW,EAAa,IAAIC,gBAEenhB,IAAlCkhB,EAAWmC,mBACbnC,EAAWI,kBAAkB6B,GAE7BjC,EAAWmC,mBAAmBF,GAGhCjC,EAAWE,OAAS,WAClB,MAAMkC,EAAM,IAAIC,MAEhBD,EAAIlC,OAAS,WACX4B,EAAOQ,OAASF,EAAIE,OACpBR,EAAOS,MAAQH,EAAIG,MACnB/gB,EAAWkC,KAAO0e,EAAIE,OACtB9gB,EAAWiC,QAAU2e,EAAIG,MACzB,MAAMC,EAAUV,EAAOW,WAAW,MAMlCD,EAAQE,UAAUnkB,KAAa,EAAG,GAClC,MAAMokB,EAAYH,EAAQI,aAAa,EAAG,EAAGR,EAAIG,MAAOH,EAAIE,QACtDO,GAAM,IAAId,MAAOC,UAEvBxgB,EAAWmC,UAAY,IAAIoI,WAAW4W,EAAUzf,KAAKic,QACrD3d,EAAWmhB,UAAYA,EACvBnhB,EAAWshB,eAAiBD,EAAM3e,EAGlC,MAAM6e,EAASC,GAAUxhB,EAAWmC,WAEpCnC,EAAWoE,mBAAqBmd,EAAOtC,IACvCjf,EAAWqE,kBAAoBkd,EAAOrC,IACtClf,EAAWyhB,gBAAkBzhB,EAAWmC,UAAU5C,OAElDqC,EAAQ5B,EACV,EAEA4gB,EAAI9W,QAAU,SAAU9B,GACtBK,EAAOL,EACT,OAEsC1K,IAAlCkhB,EAAWmC,mBACbC,EAAIxhB,IAAM,0BAA0Bf,OAAOqjB,KACzC5B,GAAoBtB,EAAW3c,WAGjC+e,EAAIxhB,IAAM,0BAA0Bf,OAAOqjB,KACzClD,EAAW3c,SAGjB,EAEA2c,EAAW1U,QAAW1L,IACpBiK,EAAOjK,EAAE,CACV,GAEL,ECzFA,SAASujB,GACP3hB,EACA4hB,EACAzf,EACA0f,EACAC,GAEA,MAAM7a,EAAU,IAAK4a,UAGd5a,EAAQ8a,cAGR9a,EAAQyF,cAEf,MAAMsV,GAAmBC,EAAAA,EAAAA,uBACnBC,EAAWjb,EAAQib,eAAY5kB,EAChB2J,EAAQkb,mBACxBhgB,EAAUwb,OAGf,OAAOqE,EAAiBI,YACtB,mBACA,aACA,CACEpiB,aACA4hB,iBACAzf,YACA8E,UACA6a,gBAEF,CACEI,WACAG,YAAapb,GAASob,aAG5B,CA2KA,SAzKA,SACEriB,EACA4hB,EACAzf,EACAme,EACArZ,EAAU,CAAC,EACX6a,GAEA,OAAQF,GACN,IAAK,oBASL,IAAK,sBASL,IAAK,sBASL,IAAK,yBASL,IAAK,sBA4BL,IAAK,yBASL,IAAK,yBASL,IAAK,yBASL,IAAK,yBASL,IAAK,yBASL,IAAK,yBASL,IAAK,yBAUL,IAAK,yBACL,IAAK,0BACL,IAAK,0BACL,IAAK,0BAEH,OAAOD,GACL3hB,EACA4hB,EACAzf,EACA8E,EACA6a,GA7FJ,IAAK,yBAKH,OAC+B,IAA7B9hB,EAAW8D,eACqB,IAA/B9D,EAAW2D,iBAAwD,IAA/B3D,EAAW2D,gBAK3Cge,GACL3hB,EACA4hB,EACAzf,EACA8E,EACA6a,GAROQ,GAA4BtiB,EAAYmC,EAAWme,GAqGhE,OAAO3e,QAAQ0G,OACb,IAAI5I,MAAM,kCAAkCmiB,KAEhD,ECjLA,SAlCA,SAAuB7f,GACrB,MAAM2B,EAAmD5B,EAAAA,SAAAA,IACvD,mBACAC,GAGF,MAAO,CACL4B,gBAAiBD,EAAiBC,gBAClCC,0BAA2BF,EAAiBE,0BAC5CM,oBAAqBR,EAAiBQ,oBACtChC,KAAMwB,EAAiBxB,KACvBD,QAASyB,EAAiBzB,QAC1B6B,cAAeJ,EAAiBI,cAChCC,WAAYL,EAAiBK,WAC7BE,oBAAqBP,EAAiBO,oBACtCG,mBAAoBV,EAAiBU,mBACrCC,kBAAmBX,EAAiBW,kBACpC1B,qCACEe,EAAiBf,qCACnB8B,uCACEf,EAAiBe,uCACnBC,sCACEhB,EAAiBgB,sCACnBI,+BACEpB,EAAiBoB,+BACnBC,iCACErB,EAAiBqB,iCACnBC,gCACEtB,EAAiBsB,gCACnB7C,eAAW7E,EACXyE,UAEJ,ECpCe,SAAS,GAACwgB,GACvB,MACgC,QAA9BA,GAC8B,kBAA9BA,GAC8B,aAA9BA,GAC8B,iBAA9BA,GAC8B,oBAA9BA,GAC8B,oBAA9BA,GAC8B,YAA9BA,GAC8B,YAA9BA,CAEJ,CCQA,IAAIC,GAAmB,GAkBvB,SAASC,GAAiBziB,GACxB,MAGM0iB,ECvCO,SACbzD,EACAC,GAEA,IAAIyD,EAiBJ,OAhBIrV,OAAOsV,UAAU3D,IAAQ3R,OAAOsV,UAAU1D,KACxCD,GAAO,EACLC,GAAO,IACTyD,EAAgBpY,WACP2U,GAAO,QAChByD,EAAgBE,aAGd5D,IAAQ,KAAOC,GAAO,IACxByD,EAAgBG,UACP7D,IAAQ,OAASC,GAAO,QACjCyD,EAAgBI,aAKfJ,GAAiBK,YAC1B,CDiBqBC,CAHFjjB,EAAWoE,mBACXpE,EAAWqE,mBAI5B,IAAIqe,EAKF,MAAM,IAAIjjB,MAAM,mDALF,CAEd,MAAMyjB,EAAa,IAAIR,EAAW1iB,EAAWmC,WAC7CnC,EAAWmC,UAAY+gB,CACzB,CAGF,CAmXA,SArVA,SACEnhB,EACAI,EACAyf,EACA3a,EAAmC,CAAC,GAKpC,MAAM/G,EAAU+G,EAAQ/G,QAUxB,GAPA+G,EAAQkc,SAAW,CACjBC,SACEnc,EAAQkc,eAAyC7lB,IAA7B2J,EAAQkc,SAASC,SACjCnc,EAAQkc,SAASC,UAIpBjhB,GAAW5C,OACd,OAAOoC,QAAQ0G,OAAO,IAAI5I,MAAM,8BAGlC,MAAM,gBAAEmX,GAAoBhM,EAAAA,MACtB0V,EAASphB,SAASmkB,cAAc,UAChCrjB,EAAasjB,GAAcvhB,GAMjC,GALA/B,EAAWujB,YAActc,EAAQsc,YAEjCtc,EAAQuc,qBAAsBC,EAAAA,EAAAA,0BAG1Bxc,EAAQkc,SAASC,QAAS,CAC5B,MAAMM,EEvGK,SAA8B5hB,EAAUC,GACrD,MAAM4hB,EAAoB7hB,EAAS9D,IAAI,oBAAqB+D,IAAY,CAAC,EAEnE6hB,EAAuB9hB,EAAS9D,IAAI,sBAAuB+D,IAC/D,CAAC,GAEG,SAAEiS,GAAa4P,EAEfF,EAAoB,CACxB5d,aAAc6d,EAAkB7d,aAChCF,iBAAkB+d,EAAkB/d,iBACpCoO,YAGI6P,EAAY/hB,EAAS9D,IAAI,gBAAiB+D,IAAY,CAAC,EAE7D,MAAO,IACF2hB,KACc,OAAb1P,GAAqB,CAAE8P,MAAOD,EAAUC,OAEhD,CFmF8BC,CAAqBjiB,EAAAA,SAAUC,GAErD2hB,IACFzc,EAAQkc,SAAW,IACdlc,EAAQkc,SACXO,kBAAmBA,GAGzB,CAEA,MAAM,aAAE5B,GAAiBla,IAKzB/J,OAAO4K,KAAKzI,GAAY0I,SAAS/K,KAEF,mBAApBqC,EAAWrC,IAClBqC,EAAWrC,aAAgBgE,iBAEpB3B,EAAWrC,EACpB,IAGF,MAAMqmB,EAAgBC,GACpBjkB,EACA4hB,EACAzf,EACAme,EACArZ,EACA6a,GAGIoC,EAAeC,GAAenkB,EAAW4D,2BAE/C,OAAO,IAAIjC,SACT,CAACC,EAASyG,KAER2b,EAAchiB,MAAK,SAAUhC,GAG3B,IAAIokB,GAAe,EAEnB,GACEnd,EAAQod,cACRpd,EAAQod,aAAa1N,OACpBuN,EACD,CACA,MAAM,YACJpU,EAAW,KACX6G,EACAtM,OAAQia,EAAY,EACpB/kB,OAAQglB,GACNtd,EAAQod,aAENG,EAAmBxkB,EAAWyhB,gBAE9BpX,EAASia,EACT/kB,EACJglB,QACIA,EACAC,EAAmBna,EAEnBoa,EAAyB,CAC7Bla,WACAsY,YACAE,WACAC,cAGF,GAAIzjB,IAAWS,EAAWyhB,gBACxB,MAAM,IAAIhiB,MACR,yDAAyDF,mCAAwCS,EAAWyhB,qBAIhH,MAAMiD,EAAwBD,EAAuB9N,GAI/CuM,EAAapT,EACf,IAAI4U,EAAsB5U,EAAazF,EAAQ9K,GAC/C,IAAImlB,EAAsB1kB,EAAWmC,WAEzC,GAAI5C,IAAWS,EAAWyhB,gBACxB,MAAM,IAAIhiB,MACR,qFAIJO,EAAWmC,UAAY+gB,EACvBkB,GAAe,CACjB,CAEKA,GACH3B,GAAiBziB,GAGnB,MAAM2kB,EACJ7iB,EAAAA,SAAAA,IAAa8U,EAAgByC,YAAatX,IAAY,CAAC,EACnD6iB,EACJ9iB,EAAAA,SAAAA,IAAa8U,EAAgBoD,QAASjY,IAAY,CAAC,EAC/C4hB,EACJ7hB,EAAAA,SAAAA,IAAa8U,EAAgB4D,aAAczY,IAAY,CAAC,EACpD8iB,EACJ/iB,EAAAA,SAAAA,IAAa8U,EAAgB+D,WAAY5Y,IAAY,CAAC,EAClD+iB,EACJhjB,EAAAA,SAAAA,IAAa8U,EAAgB8F,YAAa3a,IAAY,CAAC,GACnD,KAAEG,EAAI,QAAED,GAAYjC,EAE1B,GAAIkkB,EAAc,CAChB,GGrNK,SAAmClkB,GAChD,QAAmB1C,IAAf0C,EACF,OAAO,EAET,MAAM,KACJkC,EAAI,QACJD,EAAO,0BACP2B,EAAyB,gBACzB6d,EAAe,oBACfvd,GACElE,EAGJ,OAAIyhB,IAAoB,EAAIxf,EAAUC,IAKlC0B,EAA0BmhB,SAAS,OAEnCtD,KACC,EAAI7X,KAAKob,KAAK/iB,EAAU,GAAK2H,KAAKqU,MAAMhc,EAAU,IAAMC,EAElD0B,EAA0BmhB,SAAS,OAE1CtD,KACC,EAAI7X,KAAKob,KAAK/iB,EAAU,GAAK2H,KAAKqU,MAAMhc,EAAU,IACjD2H,KAAKob,KAAK9iB,EAAO,GACjB0H,KAAKqU,MAAM/b,EAAO,GAAKD,EAGU,QAA9B2B,GAA+D,IAAxBM,EAGlD,CHmLc+gB,CAA0BjlB,GAAa,CACzCsgB,EAAOQ,OAAS9gB,EAAWkC,KAC3Boe,EAAOS,MAAQ/gB,EAAWiC,QAE1B,IAAIkf,EADYb,EAAOW,WAAW,MACViE,gBACtBllB,EAAWiC,QACXjC,EAAWkC,MAERhC,IAGHihB,EAAY,IACPA,EACHzf,KAAM,IAAIJ,kBACR,EAAItB,EAAWiC,QAAUjC,EAAWkC,QAI1Cod,GAAkBtf,EAAYmhB,EAAUzf,KAAMxB,GAC9CF,EAAWmhB,UAAYA,EACvBnhB,EAAWmC,UAAYgf,EAAUzf,KACjC1B,EAAWyhB,gBAAkBN,EAAUzf,KAAKnC,MAC9C,MAAO,IACJW,GACDF,EAAWyhB,kBAAoB,EAAIvf,EAAOD,EAC1C,CAMA,MAAMhC,EAAc,IAAIsK,WACrBvK,EAAWmC,UAAU5C,OAAS,EAAK,GAItCS,EAAWmC,UAvMvB,SACEA,EACAkiB,GAEA,MAAMlkB,EAAYgC,EAAU5C,OAAS,EAErC,IAAIa,EAAW,EAEXC,EAAc,EAElB,IAAK,IAAIb,EAAI,EAAGA,EAAIW,EAAWX,IAC7B6kB,EAAahkB,KAAiB8B,EAAU/B,KACxCikB,EAAahkB,KAAiB8B,EAAU/B,KACxCikB,EAAahkB,KAAiB8B,EAAU/B,KACxCA,IAGF,OAAOikB,CACT,CAqLmCc,CACrBnlB,EAAWmC,UACXlC,GAGFD,EAAWyhB,gBAAkBzhB,EAAWmC,UAAU5C,MACpD,CAOA,MAAMgiB,EAASC,GAAUxhB,EAAWmC,WAEpCnC,EAAWoE,mBAAqBmd,EAAOtC,IACvCjf,EAAWqE,kBAAoBkd,EAAOrC,GACxC,CAEA,MAAMkG,EAAe7Y,EAAAA,UAAAA,aAAAA,wBAA+C,CAClE8Y,WAAYrlB,EAAWmC,UACvB4e,MAAO/gB,EAAWiC,QAClB6e,OAAQ9gB,EAAWkC,KACnBojB,mBAAoBtlB,EAAW2D,kBAG3B4hB,EAA2B,CAC/BxjB,UACAyjB,SAAUxlB,EAAWmC,UAAUsjB,YAC5BC,KACHlkB,MAAO0iB,EACPyB,YAAab,EACbxL,mBAAoBqL,EAAiBrL,mBACrCrX,QAASjC,EAAWiC,QACpB6e,OAAQ9gB,EAAWkC,KACnBihB,SAAUnjB,EAAWmjB,SACrByC,UAAWjC,EAAkB/d,iBACzB+d,EAAkB/d,iBAClB,EACJigB,MAAOlC,EAAkB7d,aACrB6d,EAAkB7d,aAClB,EACJggB,OAAiD,gBAAzC9lB,EAAW4D,0BACnBmiB,cAAe/lB,EAAWoE,mBAC1B4hB,cAAehmB,EAAWqE,kBAC1BkV,gBAAiBoL,EAAiBpL,gBAClCrX,KAAMlC,EAAWkC,KACjB+jB,YAAajmB,EAAWmC,UAAUyL,WAClCmT,MAAO/gB,EAAWiC,QAGlBkY,aAAcyK,EAAazK,aACvByK,EAAazK,aAAa,QAC1B7c,EACJ8c,YAAawK,EAAaxK,YACtBwK,EAAaxK,YAAY,QACzB9c,EACJ4oB,eAAgBtB,EAAasB,eACzBtB,EAAasB,oBACb5oB,EACJgkB,eAAgBthB,EAAWshB,eAC3B6E,oBAAgB7oB,EAChB0C,aACAolB,eACAgB,KAAMlC,GAAgBhkB,EACtBmmB,aAAcA,IAAMrmB,EAAWmC,UAC/BmkB,eAAWhpB,EACXgoB,mBAAoBtlB,EAAW2D,iBAjTzC,IAAiC4iB,EAgYzB,GA5EIhB,EAAM/jB,QACR+jB,EAAMe,UAAY,WAShB,GAAI9D,KAAqBzgB,EACvB,OAAOue,EAGT,MAAMS,EAAQwE,EAAMtjB,QACd6e,EAASyE,EAAMrjB,KAErBoe,EAAOQ,OAASA,EAChBR,EAAOS,MAAQA,EACf,MAAMyF,EAAMlG,EAAOW,WAAW,MACxBE,EAAYqF,EAAItB,gBAAgBnE,EAAOD,GAEvC2F,EAAMzmB,EAAWmC,UAEvB,GAAIskB,EAAIlnB,SAAWwhB,EAAQD,EAAS,EAClC,IAAK,IAAIthB,EAAI,EAAGA,EAAIinB,EAAIlnB,OAAQC,IAC9B2hB,EAAUzf,KAAKlC,GAAKinB,EAAIjnB,QAIvB,GAAIinB,EAAIlnB,SAAWwhB,EAAQD,EAAS,EAAG,CAC1C,IAAItW,EAAI,EACR,IAAK,IAAIhL,EAAI,EAAGA,EAAIinB,EAAIlnB,OAAQC,GAAK,EACnC2hB,EAAUzf,KAAK8I,KAAOic,EAAIjnB,GAC1B2hB,EAAUzf,KAAK8I,KAAOic,EAAIjnB,EAAI,GAC9B2hB,EAAUzf,KAAK8I,KAAOic,EAAIjnB,EAAI,GAC9B2hB,EAAUzf,KAAK8I,KAAO,GAE1B,CASA,OAPAxK,EAAWmC,UAAYgf,EAAUzf,KACjC1B,EAAWyhB,gBAAkBN,EAAUzf,KAAKnC,OAE5CS,EAAWmhB,UAAYA,EACvBqF,EAAIE,aAAa1mB,EAAWmhB,UAAW,EAAG,GAC1CqB,GAAmBzgB,EAEZue,CACT,GAKAqD,EAAkBjJ,qBAClBiJ,EAAkBjJ,oBAAoBnb,OAAS,IAtWrC,kCAJagnB,EA2WC1B,EAAgBlf,cAtW9B,mCAAhB4gB,KAwWMhB,EAAMoB,YAAchD,EAAkBjJ,oBAAoB,IAK1DkK,EAAavK,gBACbuK,EAAavK,eAAe9a,OAAS,IAErCgmB,EAAMqB,OAAShC,EAAavK,eAAe,IAGzCkL,EAAM/jB,QAGR+jB,EAAMnL,YAAc,IACpBmL,EAAMpL,aAAe,UAKE7c,IAAvBioB,EAAMpL,mBACgB7c,IAAtBioB,EAAMnL,YACN,CACA,MAAMyM,EAAStB,EAAMvlB,WAAWoE,mBAC1B0iB,EAASvB,EAAMvlB,WAAWqE,kBAEhCkhB,EAAMnL,YAAc0M,EAASD,EAC7BtB,EAAMpL,cAAgB2M,EAASD,GAAU,CAC3C,CACAjlB,EAAQ2jB,EACV,GAAGld,EAAO,GAGhB,EI5XA,SAAS0e,GACPC,EACAjlB,EACA6E,EAAQ,EACRqgB,EACAhgB,EACAigB,GAIA,MAAMxkB,GAAQ,IAAI6d,MAAOC,UACnB2G,EAA0C,CAC9CC,cAAU9pB,EACV8K,aAAS9K,GAqDX,OAlDA6pB,EAAgB/e,QAAU,IAAIzG,SAAQ,CAACC,EAASyG,KAC9C2e,EAAehlB,MACZgB,IACC,MAAMb,EAAYkkB,GAAarjB,EAAS4D,GAClCgb,EAAiB5e,EAAQa,OAAO,aAChCwjB,GAAU,IAAI9G,MAAOC,UACrB8G,EAAeC,GACnBxlB,EACAI,EACAyf,EACA3a,IAlDV,SAAoBkgB,EAAyCplB,GAC3DolB,EAAgBK,QAAU,WAExB,MAAMzQ,EAAgBC,EAAajV,GAEnCwV,EAAoB5E,OAAOoE,EAActQ,IAC3C,CACF,CA8CQghB,CAAWN,EAAiBplB,GAE5BulB,EAAatlB,MACVujB,IAECA,EAAM7jB,KAAOsB,EACbuiB,EAAM0B,eAAiBA,EACvB,MAAM5F,GAAM,IAAId,MAAOC,UAEvB+E,EAAMmC,aAAeL,EAAU3kB,EAC/B6iB,EAAMoC,cAAgBtG,EAAM3e,OAEZpF,IAAd4pB,QACgC5pB,IAAhC4pB,EAAUU,mBAEVV,EAAUU,kBAAkBrC,GAE9B3jB,EAAQ2jB,EAAM,IAEhB,SAAUvd,GAERK,EAAO,CACLL,QACAhF,WAEJ,GACD,IAEH,SAAUgF,GAERK,EAAO,CACLL,SAEJ,GACD,IAGImf,CACT,CAoDA,SAASU,GAAmB9gB,GAC1B,MAAe,aAAXA,GAAoC,YAAXA,EACpBwH,EACa,cAAXxH,EACF+gB,QADF,CAGT,CAEA,SAASC,GACPhmB,EACAkF,EAAmC,CAAC,GAEpC,MAAM8P,EAAgBC,EAAajV,UAEnCkF,EAAUpJ,OAAO8J,OAAO,CAAC,EAAGV,IAQb8a,OAGf,MAAMiG,EAAeH,GAAmB9Q,EAAchQ,QAKtD,GAAIwQ,EAAoBvF,SAAS+E,EAActQ,KAAM,CAWnD,OA3FJ,SACEzD,EACAjB,EACA6E,EAAQ,EACRqgB,EACAhgB,GAEA,MAAMvE,GAAQ,IAAI6d,MAAOC,UAqCzB,MAAO,CACLpY,QApCc,IAAIzG,SAClB,CAACC,EAASyG,KACR,MAAMgf,GAAU,IAAI9G,MAAOC,UAE3B,IAAI8G,EAEJ,IACE,MAAMnlB,EAAYkkB,GAAarjB,EAAS4D,GAClCgb,EAAiB5e,EAAQa,OAAO,aAEtCyjB,EAAeC,GAAYxlB,EAASI,EAAWyf,EAAgB3a,EACjE,CAAE,MAAOe,GAOP,YALAK,EAAO,CACLL,QACAhF,WAIJ,CAEAskB,EAAatlB,MAAMujB,IAGjBA,EAAM7jB,KAAOsB,EACbuiB,EAAM0B,eAAiBA,EACvB,MAAM5F,GAAM,IAAId,MAAOC,UAEvB+E,EAAMmC,aAAeL,EAAU3kB,EAC/B6iB,EAAMoC,cAAgBtG,EAAM3e,EAC5Bd,EAAQ2jB,EAAM,GACbld,EAAO,IAMZ+e,cAAU9pB,EAEd,CA2CW2qB,CANmB1Q,EAAAA,IACxBR,EAActQ,IACduhB,EACAjmB,GAKAA,EACAgV,EAAc/P,eACd+P,EAActQ,IACdQ,EAEJ,CASA,OAAO8f,GANgBxP,EAAoBtF,KACzC8E,EAActQ,IACduhB,EACAjmB,GAKAA,EACAgV,EAAcnQ,MACdmQ,EAActQ,IACdQ,EAEJ,CC1Ne,SAAS,MAEtBihB,EAAAA,EAAAA,qBAAoB,WAAYH,KAChCG,EAAAA,EAAAA,qBAAoB,UAAWH,KAC/BG,EAAAA,EAAAA,qBAAoB,YAAaH,IAGjCjmB,EAAAA,SAAAA,YAAqBgT,GACvB,CCYA,MASA,IACEhT,SAVe,CACfiY,oBAAmB,EACnBO,QAAO,EACPJ,wCAAuC,EACvCpG,gBAAe,EACfgB,iBAAgB,GAChB0C,mBAAkBA,IAKlBD,oBAAmB,EACnBgH,YAAW,GACXxB,0BAAyB,GACzB+B,0BAAyB,GACzBgJ,gBAAe,GACff,qBAAoB,GACpBc,mBAAkB,GAClBxB,aAAY,GACZ0B,UAAS,GACT/Q,aAAY,EACZqH,kBAAiB,GACjB8J,SAAQA,ICfV,SArBA,SACEC,EACA3U,EACA4U,GAGA,OADA5U,EAAQA,GAAS,EACZ2U,GAIAA,EAAQE,MAITzR,MAAMC,QAAQsR,EAAQE,QAAUF,EAAQE,MAAM/oB,QAAUkU,EACnD4U,EAGFD,EAAQE,MAAM7U,GAXZ4U,CAYX,ECJA,SAdA,SACED,EACA3U,EACA4U,GAEA,MAAMvpB,EAAQypB,GAA0BH,EAAS3U,EAAO4U,GAExD,QAAc/qB,IAAVwB,EAIJ,OAAOwH,WAAWoF,OAAO5M,GAC3B,ECPA,SAbA,SACEspB,EACA3U,GAEA,MAAM3U,EAAQypB,GAASH,EAAS3U,GAEhC,QAAcnW,IAAVwB,EAIJ,OAAOwH,WAAWxH,EACpB,ECyBA,SA9BA,SACEspB,EACAliB,GAEA,IAAKkiB,EACH,OAGF,IAAKA,EAAQE,MACX,OAGF,IAAKzR,MAAMC,QAAQsR,EAAQE,OACzB,OAGF,GAAIpiB,GAAiBkiB,EAAQE,MAAM/oB,OAAS2G,EAC1C,OAGF,MAAMC,EAAmB,GAEzB,IAAK,IAAI3G,EAAI,EAAGA,EAAI4oB,EAAQE,MAAM/oB,OAAQC,IAExC2G,EAAOT,KAAKY,WAAW8hB,EAAQE,MAAM9oB,KAGvC,OAAO2G,CACT,EC9Be,SAASqiB,GAAazmB,GACnC,MAAM0mB,EAAa1mB,EAAQyE,QAAQ,KAEnC,OAAOzE,EAAQ2E,UAAU+hB,EAAa,EACxC,CCXe,SAASC,GAAYzlB,EAAK0lB,GAAc,GACrD,OAAI1lB,GAAOA,EAAIqlB,MACTrlB,EAAIqlB,MAAM,IAAMK,EACX1lB,EAAIqlB,MAAM,GAGZrlB,EAAIqlB,MAGNrlB,CACT,CCRA,SAASiN,GACPC,EACAC,EACAC,GAkBA,MAAO,CACLC,QAhBAF,EACIvS,OAAOsI,OAAOiK,EAA+B,IAC7C,IAEHG,KAAKC,GAAOA,EAAG,KACfoY,QAAQpY,QAAclT,IAAPkT,GAAkC,iBAAPA,IAY3CC,UAVAN,EACItS,OAAOsI,OAAOgK,EAAiCE,EAAc,IAC7D,IAGHE,KAAKC,GAAYA,EAAG8X,MAAM,KAC1BM,QAAQpY,QAAclT,IAAPkT,GAAkC,iBAAPA,IAM/C,CAEA,SAASE,GAAyB5O,GAChC,IACE,SAAUqO,EACV,SAAUC,EACV,WAAYW,KAET8X,GACD/mB,EAYJ,OAVAqO,EAAmCuY,GACjCvY,GACA,GAEFC,EAAiCsY,GAC/BtY,GACA,GAEFW,EAAiB2X,GAAY3X,GAEtB,CACLZ,mCACAC,iCACAW,iBACA8X,OAEJ,CClDA,IAAIC,GAAqB,GACrBC,GAA+B,CAAC,EAKpC,SAASC,GAAoCC,GAC3C,MAAMC,EAAeD,EAASziB,QAAQ,YAAc,EAE9C2iB,EAAmBF,EAAS/c,MAAM,EAAGgd,GAErCtiB,EAAQE,SAASmiB,EAAS/c,MAAMgd,GAAe,IAKrD,MAAO,CACL5Z,SAHewZ,GAAmB,GAAGK,MAIrCviB,QAEJ,CAQA,SAASwiB,GAAa9Z,GAEpB,MAAM8B,EAAiBmX,GAAiBjZ,EAAS,aAEjD,OAAO8B,GAAkBA,EAAiB,CAC5C,CAoEA,UACErD,IAnEF,SAAahM,EAAiBuN,GAC5B,MAAM2Z,EAAWT,GAAazmB,GAE9BlE,OAAOC,eAAewR,EAAU,eAAgB,CAC9CxQ,MAAOsqB,GAAa9Z,GACpBvR,YAAY,IAGd+qB,GAAmBG,GAAY3Z,CACjC,EA2DEtR,IArDF,SAAa+D,GACX,MAAMknB,EAAWT,GAAazmB,GAGxBuN,EAAWwZ,GAAmBG,GAEpC,GAAI3Z,IAAaA,GAAU8Z,aAEzB,OAAO9Z,EAGT,MAAM+Z,EAAiBN,GAA6BE,GAEpD,GAAII,EACF,OAAOA,EAIT,MAAMC,EAAoBN,GAAoCC,GAE9D,IAAKK,IAAsBA,EAAkBha,SAC3C,OAGF,MAAQA,SAAUia,EAAkB,MAAE3iB,GAAU0iB,EAEhD,GAAIC,EAAoB,CAEtB,MAAMC,EDzBV,SAA8BnZ,EAAaoZ,GACzC,MAAM,iCACJtZ,EAAgC,+BAChCC,EAA8B,eAC9BW,EAAc,KACd8X,GACEnY,GAAyB+Y,GAE7B,GAAItZ,GAAoCY,EAAiB,EAAG,CAC1D,MAAM,OAAET,EAAM,SAAEG,GAAaP,GAC3BC,EACAC,EACAC,GAGIqZ,EAAc7rB,OAAO8J,OAAO8hB,EAAU,CAAEpZ,gBAS9C,MANA,IAAIC,KAAWG,GAAU/H,SAAS8M,IAChC3X,OAAO8rB,QAAQnU,GAAM9M,SAAQ,EAAE/K,EAAKmB,MAClC4qB,EAAY/rB,GAAOmB,CAAK,GACxB,IAGGjB,OAAO8J,OAAOkhB,EAAM,CAAE,WAAY9X,GAAkB2Y,EAC7D,CAEA,OAAOD,CACT,CCHqBG,CAAqBhjB,EAAO2iB,GAI7C,OAFAR,GAA6BE,GAAYO,EAElCA,CACT,CACF,EAoBE1M,OAlBF,SAAgB/a,GACd,MAAMknB,EAAWT,GAAazmB,GAE9B+mB,GAAmBG,QAAY3rB,EAE/ByrB,GAA6BE,QAAY3rB,CAC3C,EAaEsV,MAXF,WACEkW,GAAqB,GACrBC,GAA+B,CAAC,CAClC,GC3FA,SAASc,GAAa/nB,GAGpB,OAFiBymB,GAASzmB,EAAS,aAEnB+Q,SAAS,KAC3B,CAOA,SAASiX,GAAgChoB,EAAU2R,GACjD,MAAMC,EAAYgV,GAAY5mB,EAAS,aAAa,GAEpD,GAAI4R,EAMF,OAAOA,EAAUD,EAIrB,CCpBA,SAASsW,GAA+BjoB,GACtC,IAAI+R,EAA0BC,GAAgBhS,EAAS,YAAa,GAWpE,OALK+R,GAA2BgW,GAAa/nB,KAC3C+R,EDmBJ,SAAoD/R,GAClD,IAAI+R,EACJ,MAAMN,EAAeuW,GAAgChoB,EAAU,GAE/D,GAAIyR,GAAgBD,EAAoBC,GAAe,CACrD,MAAMyW,EAA8BtB,GAAY5mB,EAAS,aAErDkoB,IACFnW,EAA0BC,GACxBkW,EAA4B,YAC5B,GAGN,CAEA,OAAOnW,CACT,CClCMoW,CAA2CnoB,IAGxC+R,CACT,CASA,SAASqW,GAA4BpoB,GACnC,IAAIsS,EAAuBN,GAAgBhS,EAAS,YAAa,GAQjE,OAJKsS,GAAwByV,GAAa/nB,KACxCsS,EDuBJ,SAAiDtS,GAC/C,IAAIsS,EACJ,MAAMb,EAAeuW,GAAgChoB,EAAU,GAE/D,GAAIyR,GAAgBD,EAAoBC,GAAe,CACrD,MAAMyW,EAA8BtB,GAAY5mB,EAAS,aAErDkoB,IACF5V,EAAuBN,GACrBkW,EAA4B,YAC5B,GAGN,CAEA,OAAO5V,CACT,CCvC2B+V,CAAwCroB,IAG1DsS,CACT,CCtCA,SAASgW,GAAoB7U,EAAmB5X,GAC9C,MAAMwI,EAAS2N,GAAgByB,EAAS5X,IACxC,OAAOwI,EAASA,EAAO,GAAK,IAC9B,CCWA,SAnBA,SAA0BiiB,GAExB,OAAKA,GAASE,OAAO/oB,OAIhBsX,MAAMC,QAAQsR,EAAQE,OAUpBF,EAAQE,MARgB,iBAAlBF,EAAQE,OACjBra,QAAQY,KACN,qGAEK,CAACuZ,EAAQE,QAEX,GAXA,EAcX,ECZA,SAAShT,GAAqBhG,GAC5B,MAAMqN,EAA8B0N,GAAiB/a,EAAS,aAE9D,IAAKqN,IAAgCA,EAA4Bpd,OAC/D,OAAO,KAkDT,OA/CgBod,EAA4BpM,KAAKgF,IAC/C,MAAME,EAAiB2U,GAAoB7U,EAAU,YAC/CI,EAAiByU,GAAoB7U,EAAU,YAC/CK,EAA0BwU,GAAoB7U,EAAU,YACxDM,EAA0BuU,GAAoB7U,EAAU,YAuB9D,MAAO,CACLO,oBAtB0BsU,GAAoB7U,EAAU,YAuBxDQ,oBAtB0BqU,GAAoB7U,EAAU,YAuBxDS,oBAtB0BoU,GAAoB7U,EAAU,YAuBxDU,oBAtB0BmU,GAAoB7U,EAAU,YAuBxDW,iBAtBuBkU,GAAoB7U,EAAU,YAuBrDa,iBAtBuBgU,GAAoB7U,EAAU,YAuBrDE,iBACAE,iBACAC,0BACAC,0BACAQ,6BAzBmC+T,GACnC7U,EACA,YAwBAe,6BAtBmC8T,GACnC7U,EACA,YAqBAgB,oBAnB0B6T,GAAoB7U,EAAU,YAoBxDiB,eAlBqB4T,GAAoB7U,EAAU,YAmBnDkB,YAlBkB2T,GAAoB7U,EAAU,YAmBhDmB,oBAlB0B0T,GAAoB7U,EAAU,YAmBzD,GAIL,CCiTO,SAAS+U,GAAkBvoB,EAASD,GAIzC,MAAO,CACLma,kBACEsM,GAAiBzmB,EAAS,cAC1BymB,GAAiBzmB,EAAS,aAEhC,CAEA,SAlWA,SAASgT,EAAiB6B,EAAM5U,GAC9B,MAAM,gBAAE6U,GAAoBhM,EAAAA,MAE5B,GAAI+L,IAASC,EAAgBK,WAAY,CAEvC,MAAM,SAAE3H,EAAQ,MAAE1I,GNJtB,SAA2C7E,GAGzC,OAAOinB,GAFUR,GAAazmB,GAGhC,CMAgCwoB,CAAkCxoB,GAE9D,IAAKuN,EACH,OAEF,MAAM,iCACJa,EAAgC,+BAChCC,EAA8B,eAC9BW,GACEL,GAAyBpB,GAE7B,GAAIa,GAAoCY,EAAiB,EAAG,CAC1D,MAAM,OAAET,EAAM,SAAEG,GAAaP,GAC3BC,EACAC,EACAxJ,GAGF,MAAO,CACLmK,iBAEAqG,8BAA+B3G,EAC/B4G,4BAA6B/G,EAEjC,CAEA,MAAO,CACLS,iBAGJ,CAEA,MAAMjP,EAAW0oB,GAAgBxsB,IAAI+D,GAErC,GAAKD,EAAL,CAIA,GAAI6U,IAASC,EAAgBa,cAC3B,MAAO,CACLC,iBAAkB6Q,GAAiBzmB,EAAS,aAC5C6V,UAAWjJ,EAAAA,QAAoB6Z,GAAiBzmB,EAAS,cACzD8V,UAAWlJ,EAAAA,QACT6Z,GAAiBzmB,EAAS,YAAa,EAAG,KAE5C+V,gBAAiB0Q,GAAiBzmB,EAAS,cAI/C,GAAI6U,IAASC,EAAgBkB,eAC3B,MAAO,CACL9D,SAAUuU,GAAiBzmB,EAAS,aACpCiW,kBAAmBwQ,GAAiBzmB,EAAS,aAC7CkW,aAAcyS,GAAe3oB,EAAS,aACtCmW,iBAAkBsQ,GAAiBzmB,EAAS,aAC5CoW,WAAYxJ,EAAAA,QAAoB6Z,GAAiBzmB,EAAS,cAC1DqW,WAAYzJ,EAAAA,QACV6Z,GAAiBzmB,EAAS,YAAa,EAAG,KAE5CsW,gBAAiB1J,EAAAA,QACf6Z,GAAiBzmB,EAAS,cAE5BuW,gBAAiB3J,EAAAA,QACf6Z,GAAiBzmB,EAAS,YAAa,EAAG,MAKhD,GAAI6U,IAASC,EAAgB0B,cAC3B,MAAO,CACLC,eAAgBgQ,GAAiBzmB,EAAS,aAC1C0W,eAAgBiS,GAAe3oB,EAAS,aACxC2W,sBAAuB8P,GAAiBzmB,EAAS,aACjD4W,2BAA4B+R,GAAe3oB,EAAS,aACpD6W,4BAA6B4P,GAAiBzmB,EAAS,cAI3D,GAAI6U,IAASC,EAAgBgC,QAC3B,MAAO,CACLC,UAAW0P,GAAiBzmB,EAAS,aACrCgX,YAAayP,GAAiBzmB,EAAS,cAI3C,GAAI6U,IAASC,EAAgBmC,cAC3B,MAAO,CACLC,WAAYyR,GAAe3oB,EAAS,aACpCmX,YAAawR,GAAe3oB,EAAS,aACrCoX,WAAYqP,GAAoBzmB,EAAS,aACzCqX,cAAesR,GAAe3oB,EAAS,cAI3C,GAAI6U,IAASC,EAAgBwC,uBAAwB,CACnD,MAAMpF,EAAWuU,GAASzmB,EAAS,aAC7ByR,EAAeuW,GAAgChoB,EAAU,GAE/D,MAAO,CACLkS,WACAN,UAAW6U,GAASzmB,EAAS,aAC7ByR,eACAM,wBAAyBkW,GAA+BjoB,GACxDsS,qBAAsB8V,GAA4BpoB,GAClD6S,eAAgB8V,GAAe3oB,EAAS,aACxC4oB,qBAAsBD,GAAe3oB,EAAS,aAC9C0S,aAAcV,GAAgBhS,EAAS,YAAa,GACpDsP,eAAgBqZ,GAAe3oB,EAAS,aACxCwR,oBACEA,EAAoBC,IAAiBS,EAASnB,SAAS,MAE7D,CAEA,GAAI8D,IAASC,EAAgByC,YAAa,CAExC,IAAIxF,EAA0BkW,GAA+BjoB,GACzDsS,EAAuB8V,GAA4BpoB,GACvD,MAAM0S,EAAeV,GAAgBhS,EAAS,YAAa,GAE3D,IAAIwX,EAAqB,KACrBC,EAAkB,KAClBC,EAAa,KACbC,EAAgB,KAEhBkR,GAAqB,EAuCzB,OAtCInW,GACF+E,EAAkB/E,EAAa,GAC/B8E,EAAqB9E,EAAa,KAElCmW,GAAqB,EACrBpR,EAAkB,EAClBD,EAAqB,GAGnBzF,GACF2F,EAAa,CAEXlT,WAAWuN,EAAwB,IAEnCvN,WAAWuN,EAAwB,IAEnCvN,WAAWuN,EAAwB,KAErC4F,EAAgB,CAEdnT,WAAWuN,EAAwB,IAEnCvN,WAAWuN,EAAwB,IAEnCvN,WAAWuN,EAAwB,OAGrC2F,EAAa,CAAC,EAAG,EAAG,GACpBC,EAAgB,CAAC,EAAG,GAAI,GACxBkR,GAAqB,EACrB9W,EAA0B,IAAI2F,KAAeC,IAG1CrF,IACHA,EAAuB,CAAC,EAAG,EAAG,GAC9BuW,GAAqB,GAGhB,CACLjR,oBAAqB6O,GAAiBzmB,EAAS,aAC/CI,KAAMuoB,GAAe3oB,EAAS,aAC9BG,QAASwoB,GAAe3oB,EAAS,aACjC+R,0BACA2F,aACAC,gBACArF,uBACAO,eAAgB8V,GAAe3oB,EAAS,aACxC6X,cAAe8Q,GAAe3oB,EAAS,aACvC0S,eACA+E,kBACAD,qBACAqR,qBAEJ,CAEA,GAAIhU,IAASC,EAAgB6F,2BAC3B,OAAOnH,GAAqBxT,GAG9B,GAAI6U,IAASC,EAAgB8F,YAAa,CAGxC,GAAiB,OAFA6L,GAASzmB,EAAS,aAEZ,CAErB,MAAO,CACL6a,4BAFqBrH,GAAqBxT,GAI9C,CACF,CAEA,GAAI6U,IAASC,EAAgBgU,UAC3B,OAsHG,SAA2B7oB,EAASD,GACzC,MAAM,kBAAEma,GAAsBqO,GAAkBvoB,EAASD,GACnD+oB,EAAUte,EAAAA,UAAAA,sBAAgC0P,GAC1C6O,EAAW/oB,EAAQ2E,UAAU,GAC7BqkB,EAAYD,EAASprB,QAAQ,WAAY,eAC/C,IAAIsrB,EAAWF,EAASprB,QAAQ,WAAY,cACxCmrB,IACFG,EAAWA,EAAStrB,QAAQ,cAAe,cAE7C,MAAO,CACLmrB,UACAG,WACAD,YAEJ,CApIWE,CAAkBlpB,EAASD,GAGpC,GAAI6U,IAASC,EAAgBgD,KAC3B,OAkIG,SAAuB7X,EAASD,GACrC,MAAMopB,EAAW3C,GAAiBzmB,EAAS,aAC3C,MAAO,CACLopB,WACA9Z,eAAgBqZ,GAAe3oB,EAAS,aAE5C,CAxIWqpB,CAAcppB,EAASD,GAGhC,GAAI6U,IAASC,EAAgBkD,YAC3B,MAAO,CACLnW,gBAAiB8mB,GAAe3oB,EAAS,aACzC8B,0BAA2B2kB,GAASzmB,EAAS,aAC7CI,KAAMuoB,GAAe3oB,EAAS,aAC9BG,QAASwoB,GAAe3oB,EAAS,aACjCgC,cAAe2mB,GAAe3oB,EAAS,aACvCiC,WAAY0mB,GAAe3oB,EAAS,aACpCkC,QAASukB,GAASzmB,EAAS,aAC3BmC,oBAAqBwmB,GAAe3oB,EAAS,aAC7CoC,oBAAqBumB,GAAe3oB,EAAS,aAC7CqC,iBAAkBokB,GAASzmB,EAAS,aACpCsC,mBAAoBqmB,GAAe3oB,EAAS,aAC5CuC,kBAAmBomB,GAAe3oB,EAAS,aAC3Ca,qCAAsCmR,GACpChS,EAAS,aAEX2C,uCAAwCqP,GACtChS,EAAS,aAEX4C,sCAAuCoP,GACrChS,EAAS,aAEXgD,+BAAgCgP,GAAgBhS,EAAS,aACzDiD,iCAAkC+O,GAAgBhS,EAAS,aAC3DkD,gCAAiC8O,GAAgBhS,EAAS,cAI9D,GAAI6U,IAASC,EAAgBoD,QAC3B,MAAO,CAELG,aAAcrG,GAAgBhS,EAAS,YAAa,GACpDsY,YAAatG,GAAgBhS,EAAS,YAAa,IAIvD,GAAI6U,IAASC,EAAgB4D,aAC3B,MAAO,CAEL5U,iBAAkB6kB,GAAe3oB,EAAS,aAC1CgE,aAAc2kB,GAAe3oB,EAAS,aACtC2Y,YAAa8N,GAASzmB,EAAS,cAInC,GAAI6U,IAASC,EAAgB+D,WAC3B,MAAO,CACLhV,YAAa4iB,GAAiBzmB,EAAS,aACvCyW,eAAgBgQ,GAAiBzmB,EAAS,cAI9C,GAAI6U,IAASC,EAAgBgE,YAAa,CACxC,MAAMC,EAA0B0N,GAASzmB,EAAS,aAElD,QAAgCxE,IAA5Bud,EACF,OAGF,MAAO,CACLA,wBAAyB,CACvBG,6BAA8BtM,EAAAA,QAC5B6Z,GAAS1N,EAAwB,YAAa,EAAG,KAEnDuQ,iCAAkC7C,GAChC1N,EAAwB,YACxB,EACA,IAEFI,sBAAuBwP,GACrB5P,EAAwB,aAE1BK,qBAAsBuP,GACpB5P,EAAwB,cAIhC,CAEA,OAAIlE,IAASC,EAAgBuE,cCrThB,SAA+BrZ,GAC5C,MAAMsZ,EAAW,GAEjB,IAAK,IAAIC,EAAe,EAAMA,GAAgB,GAAMA,GAAgB,EAAM,CACxE,IAAIC,EAAW,MAAMD,EAAaE,SAAS,MAEnB,IAApBD,EAAS/b,SACX+b,EAAW,OAAOD,EAAaE,SAAS,OAS1C,MAAM7Z,EAAO6mB,GAASzmB,EAAS,GAAGwZ,UAElC,IAAK5Z,EACH,SAGF,MAAMS,EAAY,GAElB,IAAK,IAAI3C,EAAI,EAAGA,EAAIkC,EAAKnC,OAAQC,IAC/B,IAAK,IAAIgc,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMC,EAAc3Z,EAASwmB,MAAM5mB,EAAK+B,WAAajE,GAErD2C,EAAc,EAAJ3C,EAAQgc,GAAMC,GAAeD,EAAK,CAC9C,CAGFJ,EAAS1V,KAAK,CACZxD,KAAMuoB,GAAe3oB,EAAS,GAAGwZ,UACjCrZ,QAASwoB,GAAe3oB,EAAS,GAAGwZ,UACpC3E,KAAM4R,GAASzmB,EAAS,GAAGwZ,UAC3BI,EAAG+O,GAAe3oB,EAAS,GAAGwZ,SAAiB,GAAK,EACpD3a,EAAG8pB,GAAe3oB,EAAS,GAAGwZ,SAAiB,GAAK,EACpDnZ,YACAwZ,YAAa4M,GAASzmB,EAAS,GAAGwZ,UAClCM,MAAO2M,GAASzmB,EAAS,GAAGwZ,UAC5BO,QAAS0M,GAASzmB,EAAS,GAAGwZ,UAC9BQ,QAASyM,GAASzmB,EAAS,GAAGwZ,UAC9BS,qBAAsBwM,GAASzmB,EAAS,GAAGwZ,WAE/C,CAEA,MAAO,CACLF,WAEJ,CDoQWY,CAAsBla,GAKlB,mBAAT6U,EACK2T,GAAkBvoB,EAASD,GAGhC6U,IAASC,EAAgBsF,WACpB,CACLC,eAAgBoM,GAASzmB,EAAS,aAClCsa,MAAOmM,GAASzmB,EAAS,aACzBua,gBAAiBkM,GAASzmB,EAAS,cAInC6U,IAASC,EAAgB0F,UACpB,CACLC,mBAAoBkO,GAAe3oB,EAAS,aAC5C0a,oBAAqBiO,GAAe3oB,EAAS,cAKpC,aAAT6U,EACK9B,EAAkB9S,EAAS+S,EAAkBO,QADtD,CAjRA,CAoRF,EEvTe,SAASgW,GACtB5kB,EACA1E,EACA8F,EAAyC,CAAC,EAC1CZ,EAA0C,CAAC,GAO3C,MAAMwF,EAAgB7E,KAChB,gBAAEwE,EAAkB,CAAC,EAAyB,cAAEM,GACpDzF,EACIqkB,EACJ5e,EAAc4e,WAsIlB,SAAkBvpB,EAAiB3C,EAAKmsB,GACtC,MAAMzsB,EAAQM,EAAImsB,GAClB,GAAqB,mBAAVzsB,EACT,OAAOA,EAET,MAAMgD,EAAW0oB,GAAgBxsB,IAAI+D,GACrC,OAAOjD,EAAMgD,EAAUC,EACzB,CA5IIwmB,CAASxmB,EAASqK,EAAiB,cACnC,MAYIhE,EAAU,IAAIzG,SAMjBmL,MAAOlL,EAASyG,KACjB,MAAMG,EAAU3K,OAAO8J,OACrB,CAAC,EACDE,GAIFhK,OAAO4K,KAAKD,GAASE,SAAQ,SAAU/K,GAChB,OAAjB6K,EAAQ7K,SAAkCL,IAAjBkL,EAAQ7K,WAC5B6K,EAAQ7K,EAEnB,IAEA,IACO+O,EAAcc,cACjBd,EAAc4e,UAAYA,EAC1B5e,EAAc8e,cAAgB,GAEhC,MAAMzb,EAyGZ,SACErD,EACAN,GAEA,MAAM,WAAEiB,EAAU,YAAEG,EAAW,UAAE8d,EAAY,OAAU5e,GACjD,WAAE+e,EAAa,GAAMrf,EAC3B,MAAoB,IAAhBqf,GAAuBpe,GAAeG,GACxC,MAAO,CAAC,EAAG,IAEb,IAAoB,IAAhBie,GAAqBje,GAAaI,WAAaP,EAAaie,EAC9D,MAAO,CAAC9d,GAAaI,YAAc,EAAG,IAIxC,MAAO,CAACJ,GAAaI,YAAc,EAAG0d,GAAaG,EAAa,GAAK,EACvE,CAxHwBC,CAAahf,EAAeN,IAExC,YAAEoB,EAAW,gBAAEnC,SAuC3ByB,eACErG,EACA+B,EACAmjB,EACAjf,GAEIif,IACFnjB,EAAU3K,OAAO8J,OAAOa,EAAS,CAC/BojB,MAAO,SAASD,EAAM,MAAMA,EAAM,QAGtC,IAAI,YAAEne,GAAgBd,EACtB,GAAIif,EAAM,IAAMne,GAAaI,WAAa+d,EAAM,GAC9C,OAAOjf,EAET,MAAMpF,QAAiB0F,MAAMvG,EAAK,CAChC+B,UACAyE,YAAQ3P,IAGJuuB,QAA4BvkB,EAASwI,cACrCgc,EAAqB,IAAIvhB,WAAWshB,IACpC,OAAE3jB,GAAWZ,EAGnB,IAAIykB,EACAve,GACFue,EAAe,IAAIxhB,WACjBiD,EAAYjO,OAASusB,EAAmBvsB,QAE1CwsB,EAAazrB,IAAIkN,EAAa,GAC9Bue,EAAazrB,IAAIwrB,EAAoBte,EAAYjO,QACjDmN,EAAc8e,cAAgB,IAE9BO,EAAe,IAAIxhB,WAAWuhB,EAAmBvsB,QACjDwsB,EAAazrB,IAAIwrB,EAAoB,GACrCpf,EAAc8e,iBAEhB9e,EAAcc,YAAcA,EAAcue,EAC1Crf,EAAcrB,gBAAkB/D,EAASkB,QAEzC,MAAMwjB,EAAe1kB,EAASkB,QAAQxK,IAAI,iBACtCguB,EACFtf,EAAcW,WAAaC,OAAO0e,EAAa3lB,MAAM,KAAK,IACtC,MAAX6B,GAAmByjB,EAEN,KAAbA,EAAM,IAAane,GAAajO,OAASosB,EAAM,GACxDjf,EAAcW,WAAaG,EAAYI,WAEvClB,EAAcW,WAAaC,OAAO2e,iBAJlCvf,EAAcW,WAAaG,GAAaI,WAO1C,OAAOlB,CACT,CA5FqDwf,CAC7CzlB,EACA+B,EACAuH,EACArD,GAMI5B,EAAcO,EAAgBrN,IAAI,iBAClC,WAAEqP,GAAeX,EACjByf,EAAe9e,IAAeG,EAAYI,WAC1Cwe,EAAUvhB,EAAiBC,EAAa0C,EAAa,CACzDxC,WAAW,IAIPC,EAAqBkB,EACzBC,EACA+f,GAAgBC,EAAQngB,aAE1BrK,EAAQ,IACHwqB,EACHnhB,qBACAvB,gBAAiB0iB,EAAQngB,YACrB,IACa,IAAZqf,EAAmBje,GAE5B,CAAE,MAAOW,GAjEeA,KACxB,GAA8C,mBAAnCvB,EAAc1E,iBAAiC,CACxD,MAAMC,EAAQ,IAAIvI,MAAM,kBACxBgN,EAAc1E,iBAAiBC,EACjC,MACEiG,QAAQY,KAAK,sBAAuBb,EACtC,EA4DEjG,CAAiBiG,GACjBC,QAAQjG,MAAMgG,GACd3F,EAAO2F,EACT,KAGF,OAAO5F,CACT,CCtDA,SA5DA,SACEmH,EACAxN,EACAsqB,EAAY,2BACZplB,GAEA,MAAM,cAAEyF,EAAa,gBAAEN,EAAkB,CAAC,GACxCnF,GAAW,CAAC,EACRuB,EAAU,CACd8jB,OAAQD,GAKV,IAAI5lB,EAAM2F,EAAgBmgB,aACtB,GAAGhd,KAA4B,IAAtBA,EAAI/I,QAAQ,KAAc,IAAM,MACvC4F,EAAgBmgB,eAElBhd,EAaJ,GATInD,EAAgBogB,aAClB/lB,EAAMA,EAAI/G,QAAQ,WAAY0M,EAAgBogB,aAI5C9f,GAAejG,MAAQA,IACzBQ,EAAQyF,cAAgB,CAAEjG,aAIqCnJ,IAA9D8O,EAA+Cqf,WAEhD,OAAOJ,GAAa5kB,EAAK1E,EAASyG,EAASvB,GAI7C,GAAKmF,EAAmDqgB,UACtD,OAAOjgB,EAAc/F,EAAK1E,EAASyG,EAASvB,GAM9C,MAAMylB,EAAcne,EAAW9H,EAAK1E,EAASyG,IACvC,IAAErB,GAAQulB,EAEhB,OAAOA,EAAY1qB,MAAK,SAAU+I,GAChC,MAEM8C,EAAYhD,EADhB1D,EAAIwlB,kBAAkB,iBAAmB,2BAGzC,IAAIpiB,WAAWQ,IAGjB,OADA8C,EAAU5C,mBAAqBkB,EAAsBC,GAAiB,GAC/DyB,CACT,GACF,GCxDQvB,oBAAmBA,IAAKC,EAAAA,WACxB5B,mBAAkBA,IAAKC,EAAAA,MACzBgiB,GAA6B,IAAIC,IAAY,CAEjD,yBAEA,0BAGA,4BAQK,SAASC,GAAgChiB,GAC9C,MAAMiiB,EAAwB,oBAC9B,IAAKjiB,EACH,OAAOiiB,EAIT,MAAMC,EAAaliB,EAAYzE,MAAM,KAC/ByB,EAAiC,CAAC,EAExCklB,EAAWtkB,SAASukB,IAElB,MAAMC,EAAkBD,EAAU5mB,MAAM,KAExC,GAA+B,IAA3B6mB,EAAgB3tB,OAClB,OAGF,MAAMT,EAAQouB,EAAgB,GAAGnhB,OAAOrM,QAAQ,KAAM,IAEtDoI,EAAOolB,EAAgB,GAAGnhB,QAAUjN,CAAK,IAM3C,MAAMquB,EAA8B,CAClC,aAAc,yBACd,oBAAqB,sBACrB,cAAe,yBACf,YAAa,yBACb,YAAa,yBACb,YAAa,yBACb,YAAa,yBAEb,aAAc,yBACd,YAAa,2BAGf,OAAIrlB,EAAO,mBACFA,EAAO,mBAEdgD,IACCjN,OAAO4K,KAAKX,GAAQvI,QACrB4tB,EAA4BriB,GAGrBqiB,EAA4BriB,GAC1BhD,EAAO6O,MAAQwW,EAA4BrlB,EAAO6O,MACpDwW,EAA4BrlB,EAAO6O,MACjCwW,EAA4BriB,GAC9BqiB,EAA4BriB,GAG9BiiB,CACT,CA4IA,SAASK,GAAwBC,EAAiBC,EAAsB,GACtE,MAAMC,EAAWF,EAAU,IAAM,IACjC,OAAIE,EAAW,EAAI,EACV3jB,KAAKqV,IAAIqO,EAAqB,GAEnCC,EAAW,EAAI,GACV3jB,KAAKqV,IAAIqO,EAAqB,GAEnCC,EAAW,EAAI,GACV3jB,KAAKqV,IAAIqO,EAAqB,GAEhC1jB,KAAKqV,IAAIqO,EAAqB,EACvC,CAEA,SAlHA,SACEvrB,EACAkF,EAA0C,CAAC,GAE3C,MAAMumB,EAzCCC,EAAAA,0BA2CD/qB,GAAQ,IAAI6d,MAAOC,UAEnBkN,EAAuB,IAAIphB,GAC/B,cAmEI+V,EACJpb,EAAQob,aAAesL,EAAAA,MAAAA,YAAAA,YACnBC,EAAoB3mB,EAAQ2mB,mBAAqB,CAAE7rB,WACnDmgB,OAAgC5kB,IAArB2J,EAAQib,SAAyB,EAAIjb,EAAQib,SACxD3S,EAAMxN,EAAQ2E,UAAU,GAS9B,OAPA8mB,EAAmBK,WAvEnB/gB,eAAuBmc,EAAkBlnB,EAAiBsqB,GACxDqB,EAAqB7gB,UAASC,UAE5B,MAAMghB,EAAexhB,GAAoByhB,GACvC1H,GAAa4C,EAAUlnB,EAASsqB,EAAWplB,IAE7C,IAAI+mB,EAAkB,GACtB,UAAW,MAAMnsB,KAAUisB,EAAc,CACvC,MAAM,UACJ3rB,EAAS,mBACT8I,EAAqBN,GAAmBQ,gBAAe,gBACvDzB,EAAe,KACf2C,GAAO,EAAI,YACXJ,GAAc,GACZpK,EACE+f,EAAiBkL,GACrBjrB,EAAOiJ,aAET,IAAKmB,IAAgB2gB,GAA2BqB,IAAIrM,GAClD,SAEF,MAAM2B,EACJ1hB,EAAO0hB,cACNtY,IAAuBN,GAAmBQ,gBACvC,EACAiiB,GACE1jB,EACAzC,EAAQmF,iBAAiBmX,cAEjC,GAAKlX,KAAQ2hB,GAAmBzK,GAKhC,IACE,MAAM2K,EAAa,IACdjnB,EACHsc,eAEIgC,QAAegC,GACnBxlB,EACAI,EACAyf,EACAsM,GAII7M,GAAM,IAAId,MAAOC,UAEvB+E,EAAMmC,aAAerG,EAAM3e,EAC3B6iB,EAAMtJ,kBAAoB2F,EAC1B2D,EAAMta,mBAAqBA,EAE3BuF,EAAGzC,IAAIwX,EAAOlZ,GACd2hB,EAAkBzK,CACpB,CAAE,MAAOnlB,GACP,GAAI6N,EAEF,MADAgC,QAAQY,KAAK,kBAAmBzQ,GAC1BA,CAEV,CACF,IAEJ,EASU+vB,KAAKpxB,KAAMwS,EAAKxN,EArF1B,uEAsFEsgB,EACAuL,EACA1L,GAGK,CACL9Z,QAASslB,EAAqBU,iBAC9BhH,cAAU9pB,EAEd,ECpNe,SAAS,MAEtB4qB,EAAAA,EAAAA,qBAAoB,SAAUH,IAC9BjmB,EAAAA,SAAAA,YAAqBgT,GACvB,CCGA,MAQA,IACEhT,SATe,CACfusB,gBAAe,GACf5D,eAAc,GACd3W,gBAAe,GACfyU,SAAQ,GACRzT,iBAAgBA,IAKhBtJ,kBAAiB,EACjB6a,aAAY,GACZ0B,UAAS,GACTyC,gBAAe,GACfrC,SAAQA,ICXV,SALA,WACEmG,KACAC,IACF,ECPMC,GAAWA,KACf,MAAMC,EAAO,IAAIC,IAAI,YAErB,OADiB,IAAIC,OAAOF,EAAM,CAAE9X,KAAM,UAC3B,EA0BjB,SAvBA,SAAc1P,GAIZQ,EAAWR,GACX2nB,KAEA,MAAMC,GAAgB5M,EAAAA,EAAAA,uBAChB6M,EAAa7nB,GAAS8nB,eAM9B,WACE,GAAyB,oBAAdC,WAA6BA,UAAUC,oBAEhD,OAAOrlB,KAAKsV,IAAI,EAAGtV,KAAKqU,MAAM+Q,UAAUC,oBAAsB,IAGhE,OAAO,CACT,CAb+CC,GAC7CL,EAAcM,eAAe,mBAAoBX,GAAU,CACzDY,mBAAoBN,GAExB,ECLA,SAhBA,SACE9uB,EACA4hB,GAKA,GAFAA,EAAiBA,GAAkB5hB,EAAW4hB,eAGf,IAA7B5hB,EAAW8D,eACQ,2BAAnB8d,IACgC,IAA/B5hB,EAAW2D,iBAAwD,IAA/B3D,EAAW2D,iBAEhD,OAAO,CAEX,EC6CA,GAxCoC,CAClCyb,uBAAsB,EACtBC,uBAAsB,EACtBM,sBAAqB,EACrBC,sBAAqB,EACrBL,oBAAmB,EACnB8P,QAAO,GACPC,OAAM,GACNC,KAAI,GACJjQ,kBAAiB,GACjBiI,YAAW,GACXjF,4BAA2B,GAC3BgB,cAAa,GACb+C,aAAY,GACZ7E,UAAS,GACT0C,aAAY,GACZsL,wBAAuB,GACvBlhB,SAAQA,E","sources":["webpack:///webpack/universalModuleDefinition","webpack:///external umd \"@cornerstonejs/core\"","webpack:///external umd {\"commonjs\":\"dicom-parser\",\"commonjs2\":\"dicom-parser\",\"amd\":\"dicom-parser\",\"root\":\"dicomParser\"}","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/jsonp chunk loading","webpack:///./imageLoader/colorSpaceConverters/convertRGBColorByPixel.ts","webpack:///./imageLoader/colorSpaceConverters/convertRGBColorByPlane.ts","webpack:///./imageLoader/colorSpaceConverters/convertYBRFullByPixel.ts","webpack:///./imageLoader/colorSpaceConverters/convertYBRFullByPlane.ts","webpack:///./imageLoader/colorSpaceConverters/convertPALETTECOLOR.ts","webpack:///./imageLoader/wadouri/metaData/getImagePixelModule.ts","webpack:///./imageLoader/wadouri/metaData/getLUTs.ts","webpack:///./imageLoader/wadouri/metaData/getModalityLUTOutputPixelRepresentation.ts","webpack:///./imageLoader/wadouri/metaData/getNumberValues.ts","webpack:///./imageLoader/wadouri/parseImageId.ts","webpack:///./imageLoader/internal/options.ts","webpack:///./imageLoader/internal/xhrRequest.ts","webpack:///./imageLoader/wadors/findIndexOfString.ts","webpack:///./imageLoader/wadors/extractMultipart.ts","webpack:///./imageLoader/wadors/getImageQualityStatus.ts","webpack:///./imageLoader/internal/streamRequest.ts","webpack:///./imageLoader/internal/index.ts","webpack:///./imageLoader/wadouri/dataset-from-partial-content.ts","webpack:///./imageLoader/wadouri/combineFrameInstanceDataset.ts","webpack:///./imageLoader/wadouri/loadedDataSets.ts","webpack:///./imageLoader/wadouri/retrieveMultiframeDataset.ts","webpack:///./imageLoader/wadouri/dataSetCacheManager.ts","webpack:///./imageLoader/isNMReconstructable.ts","webpack:///./imageLoader/wadouri/metaData/extractPositioningFromDataset.ts","webpack:///./imageLoader/getInstanceModule.ts","webpack:///./imageLoader/wadouri/metaData/USHelpers.ts","webpack:///./imageLoader/wadouri/metaData/metaDataProvider.ts","webpack:///./imageLoader/wadouri/metaData/getOverlayPlaneModule.ts","webpack:///./imageLoader/wadouri/fileManager.ts","webpack:///./imageLoader/wadouri/getEncapsulatedImageFrame.ts","webpack:///./imageLoader/wadouri/unpackBinaryFrame.ts","webpack:///./imageLoader/wadouri/getUncompressedImageFrame.ts","webpack:///./imageLoader/wadouri/loadFileRequest.ts","webpack:///./imageLoader/wadouri/getPixelData.ts","webpack:///./shared/getMinMax.ts","webpack:///./imageLoader/convertColorSpace.ts","webpack:///./imageLoader/colorSpaceConverters/convertYBRFull422ByPixel.ts","webpack:///./imageLoader/decodeJPEGBaseline8BitColor.ts","webpack:///./imageLoader/decodeImageFrame.ts","webpack:///./imageLoader/getImageFrame.ts","webpack:///./shared/isColorImage.ts","webpack:///./imageLoader/createImage.ts","webpack:///./shared/getPixelDataTypeFromMinMax.ts","webpack:///./imageLoader/getScalingParameters.ts","webpack:///./imageLoader/isColorConversionRequired.ts","webpack:///./imageLoader/wadouri/loadImage.ts","webpack:///./imageLoader/wadouri/register.ts","webpack:///./imageLoader/wadouri/index.ts","webpack:///./imageLoader/wadors/metaData/getValue.ts","webpack:///./imageLoader/wadors/metaData/getNumberString.ts","webpack:///./imageLoader/wadors/metaData/getNumberValue.ts","webpack:///./imageLoader/wadors/metaData/getNumberValues.ts","webpack:///./imageLoader/imageIdToURI.ts","webpack:///./imageLoader/wadors/getTagValue.ts","webpack:///./imageLoader/wadors/combineFrameInstance.ts","webpack:///./imageLoader/wadors/metaDataManager.ts","webpack:///./imageLoader/wadors/metaData/NMHelpers.ts","webpack:///./imageLoader/wadors/metaData/extractPositioningFromMetadata.ts","webpack:///./imageLoader/wadors/metaData/getFirstNumberValue.ts","webpack:///./imageLoader/wadors/metaData/getSequenceItems.ts","webpack:///./imageLoader/wadors/metaData/USHelpers.ts","webpack:///./imageLoader/wadors/metaData/metaDataProvider.ts","webpack:///./imageLoader/wadors/metaData/getOverlayPlaneModule.ts","webpack:///./imageLoader/internal/rangeRequest.ts","webpack:///./imageLoader/wadors/getPixelData.ts","webpack:///./imageLoader/wadors/loadImage.ts","webpack:///./imageLoader/wadors/register.ts","webpack:///./imageLoader/wadors/index.ts","webpack:///./imageLoader/registerLoaders.ts","webpack:///./init.ts","webpack:///./imageLoader/isJPEGBaseline8BitColor.ts","webpack:///./imageLoader/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@cornerstonejs/core\"), require(\"dicom-parser\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstoneDICOMImageLoader\", [\"@cornerstonejs/core\", \"dicom-parser\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstoneDICOMImageLoader\"] = factory(require(\"@cornerstonejs/core\"), require(\"dicom-parser\"));\n\telse\n\t\troot[\"cornerstoneDICOMImageLoader\"] = factory(root[\"@cornerstonejs/core\"], root[\"dicomParser\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__464__, __WEBPACK_EXTERNAL_MODULE__713__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__464__;","module.exports = __WEBPACK_EXTERNAL_MODULE__713__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t527: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// no jsonp function","import type { ByteArray } from 'dicom-parser';\n\nexport default function (\n imageFrame: ByteArray,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n if (imageFrame === undefined) {\n throw new Error('decodeRGB: rgbBuffer must be defined');\n }\n if (imageFrame.length % 3 !== 0) {\n throw new Error(\n `decodeRGB: rgbBuffer length ${imageFrame.length} must be divisible by 3`\n );\n }\n\n const numPixels = imageFrame.length / 3;\n\n let rgbIndex = 0;\n\n let bufferIndex = 0;\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; i++) {\n colorBuffer[bufferIndex++] = imageFrame[rgbIndex++]; // red\n colorBuffer[bufferIndex++] = imageFrame[rgbIndex++]; // green\n colorBuffer[bufferIndex++] = imageFrame[rgbIndex++]; // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n }\n\n return;\n }\n\n // if RGB buffer\n colorBuffer.set(imageFrame);\n}\n","import type { ByteArray } from 'dicom-parser';\n\nexport default function (\n imageFrame: ByteArray,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n if (imageFrame === undefined) {\n throw new Error('decodeRGB: rgbBuffer must be defined');\n }\n if (imageFrame.length % 3 !== 0) {\n throw new Error(\n `decodeRGB: rgbBuffer length ${imageFrame.length} must be divisible by 3`\n );\n }\n\n const numPixels = imageFrame.length / 3;\n\n let bufferIndex = 0;\n\n let rIndex = 0;\n\n let gIndex = numPixels;\n\n let bIndex = numPixels * 2;\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; i++) {\n colorBuffer[bufferIndex++] = imageFrame[rIndex++]; // red\n colorBuffer[bufferIndex++] = imageFrame[gIndex++]; // green\n colorBuffer[bufferIndex++] = imageFrame[bIndex++]; // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n }\n } else {\n for (let i = 0; i < numPixels; i++) {\n colorBuffer[bufferIndex++] = imageFrame[rIndex++]; // red\n colorBuffer[bufferIndex++] = imageFrame[gIndex++]; // green\n colorBuffer[bufferIndex++] = imageFrame[bIndex++]; // blue\n }\n }\n}\n","import type { ByteArray } from 'dicom-parser';\n\nexport default function (\n imageFrame: ByteArray,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n if (imageFrame === undefined) {\n throw new Error('convertYBRFullByPixel: ybrBuffer must be defined');\n }\n if (imageFrame.length % 3 !== 0) {\n throw new Error(\n `convertYBRFullByPixel: ybrBuffer length ${imageFrame.length} must be divisible by 3`\n );\n }\n\n const numPixels = imageFrame.length / 3;\n\n let ybrIndex = 0;\n\n let bufferIndex = 0;\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; i++) {\n const y = imageFrame[ybrIndex++];\n const cb = imageFrame[ybrIndex++];\n const cr = imageFrame[ybrIndex++];\n\n colorBuffer[bufferIndex++] = y + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y + 1.772 * (cb - 128); // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n }\n\n return;\n }\n\n for (let i = 0; i < numPixels; i++) {\n const y = imageFrame[ybrIndex++];\n const cb = imageFrame[ybrIndex++];\n const cr = imageFrame[ybrIndex++];\n\n colorBuffer[bufferIndex++] = y + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y + 1.772 * (cb - 128); // blue\n }\n}\n","import type { ByteArray } from 'dicom-parser';\n\nexport default function (\n imageFrame: ByteArray,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n if (imageFrame === undefined) {\n throw new Error('convertYBRFullByPlane: ybrBuffer must be defined');\n }\n if (imageFrame.length % 3 !== 0) {\n throw new Error(\n `convertYBRFullByPlane: ybrBuffer length ${imageFrame.length} must be divisible by 3`\n );\n }\n\n const numPixels = imageFrame.length / 3;\n\n let bufferIndex = 0;\n\n let yIndex = 0;\n\n let cbIndex = numPixels;\n\n let crIndex = numPixels * 2;\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; i++) {\n const y = imageFrame[yIndex++];\n const cb = imageFrame[cbIndex++];\n const cr = imageFrame[crIndex++];\n\n colorBuffer[bufferIndex++] = y + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y + 1.772 * (cb - 128); // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n }\n\n return;\n }\n\n for (let i = 0; i < numPixels; i++) {\n const y = imageFrame[yIndex++];\n const cb = imageFrame[cbIndex++];\n const cr = imageFrame[crIndex++];\n\n colorBuffer[bufferIndex++] = y + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y + 1.772 * (cb - 128); // blue\n }\n}\n","import type { ByteArray } from 'dicom-parser';\nimport { metaData, type Types } from '@cornerstonejs/core';\n\nfunction convertLUTto8Bit(lut: number[], shift: number) {\n const numEntries = lut.length;\n const cleanedLUT = new Uint8ClampedArray(numEntries);\n\n for (let i = 0; i < numEntries; ++i) {\n cleanedLUT[i] = lut[i] >> shift;\n }\n\n return cleanedLUT;\n}\n\nfunction fetchPaletteData(imageFrame, color, fallback) {\n const data = imageFrame[`${color}PaletteColorLookupTableData`];\n if (data) {\n return Promise.resolve(data);\n }\n\n const result = metaData.get('imagePixelModule', imageFrame.imageId);\n\n if (result && typeof result.then === 'function') {\n return result.then((module) =>\n module ? module[`${color}PaletteColorLookupTableData`] : fallback\n );\n } else {\n return Promise.resolve(\n result ? result[`${color}PaletteColorLookupTableData`] : fallback\n );\n }\n}\n\n/**\n * Convert pixel data with PALETTE COLOR Photometric Interpretation to RGBA\n *\n * @param imageFrame - The ImageFrame to convert\n * @param colorBuffer - The buffer to write the converted pixel data to\n * @returns\n */\nexport default function (\n imageFrame: Types.IImageFrame,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n const numPixels = imageFrame.columns * imageFrame.rows;\n const pixelData = imageFrame.pixelData;\n\n Promise.all([\n fetchPaletteData(imageFrame, 'red', null),\n fetchPaletteData(imageFrame, 'green', null),\n fetchPaletteData(imageFrame, 'blue', null),\n ]).then(([rData, gData, bData]) => {\n if (!rData || !gData || !bData) {\n throw new Error(\n 'The image does not have a complete color palette. R, G, and B palette data are required.'\n );\n }\n\n const len = rData.length;\n let palIndex = 0;\n let bufferIndex = 0;\n\n const start = imageFrame.redPaletteColorLookupTableDescriptor[1];\n const shift =\n imageFrame.redPaletteColorLookupTableDescriptor[2] === 8 ? 0 : 8;\n\n const rDataCleaned = convertLUTto8Bit(rData, shift);\n const gDataCleaned = convertLUTto8Bit(gData, shift);\n const bDataCleaned = convertLUTto8Bit(bData, shift);\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; ++i) {\n let value = pixelData[palIndex++];\n\n if (value < start) {\n value = 0;\n } else if (value > start + len - 1) {\n value = len - 1;\n } else {\n value -= start;\n }\n\n colorBuffer[bufferIndex++] = rDataCleaned[value];\n colorBuffer[bufferIndex++] = gDataCleaned[value];\n colorBuffer[bufferIndex++] = bDataCleaned[value];\n colorBuffer[bufferIndex++] = 255;\n }\n\n return;\n }\n\n for (let i = 0; i < numPixels; ++i) {\n let value = pixelData[palIndex++];\n\n if (value < start) {\n value = 0;\n } else if (value > start + len - 1) {\n value = len - 1;\n } else {\n value -= start;\n }\n\n colorBuffer[bufferIndex++] = rDataCleaned[value];\n colorBuffer[bufferIndex++] = gDataCleaned[value];\n colorBuffer[bufferIndex++] = bDataCleaned[value];\n }\n });\n}\n","import type { Types } from '@cornerstonejs/core';\nimport type { DataSet } from 'dicom-parser';\n\nfunction getLutDescriptor(dataSet: DataSet, tag: string) {\n if (!dataSet.elements[tag] || dataSet.elements[tag].length !== 6) {\n return;\n }\n\n return [\n dataSet.uint16(tag, 0),\n dataSet.uint16(tag, 1),\n dataSet.uint16(tag, 2),\n ];\n}\n\nfunction getLutData(lutDataSet: DataSet, tag: string, lutDescriptor): number[] {\n const lut = [];\n const lutData = lutDataSet.elements[tag];\n\n for (let i = 0; i < lutDescriptor[0]; i++) {\n // Output range is always unsigned\n if (lutDescriptor[2] === 16) {\n lut[i] = lutDataSet.uint16(tag, i);\n } else {\n lut[i] = lutDataSet.byteArray[i + lutData.dataOffset];\n }\n }\n\n return lut;\n}\n\nfunction populatePaletteColorLut(\n dataSet: DataSet,\n imagePixelModule: Types.ImagePixelModuleMetadata\n) {\n imagePixelModule.redPaletteColorLookupTableDescriptor = getLutDescriptor(\n dataSet,\n 'x00281101'\n );\n imagePixelModule.greenPaletteColorLookupTableDescriptor = getLutDescriptor(\n dataSet,\n 'x00281102'\n );\n imagePixelModule.bluePaletteColorLookupTableDescriptor = getLutDescriptor(\n dataSet,\n 'x00281103'\n );\n\n // The first Palette Color Lookup Table Descriptor value is the number of entries in the lookup table.\n // When the number of table entries is equal to 2ˆ16 then this value shall be 0.\n // See http://dicom.nema.org/MEDICAL/DICOM/current/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.5\n if (imagePixelModule.redPaletteColorLookupTableDescriptor[0] === 0) {\n imagePixelModule.redPaletteColorLookupTableDescriptor[0] = 65536;\n imagePixelModule.greenPaletteColorLookupTableDescriptor[0] = 65536;\n imagePixelModule.bluePaletteColorLookupTableDescriptor[0] = 65536;\n }\n\n // The third Palette Color Lookup Table Descriptor value specifies the number of bits for each entry in the Lookup Table Data.\n // It shall take the value of 8 or 16.\n // The LUT Data shall be stored in a format equivalent to 8 bits allocated when the number of bits for each entry is 8, and 16 bits allocated when the number of bits for each entry is 16, where in both cases the high bit is equal to bits allocated-1.\n // The third value shall be identical for each of the Red, Green and Blue Palette Color Lookup Table Descriptors.\n //\n // Note: Some implementations have encoded 8 bit entries with 16 bits allocated, padding the high bits;\n // this can be detected by comparing the number of entries specified in the LUT Descriptor with the actual value length of the LUT Data entry.\n // The value length in bytes should equal the number of entries if bits allocated is 8, and be twice as long if bits allocated is 16.\n const numLutEntries =\n imagePixelModule.redPaletteColorLookupTableDescriptor[0];\n const lutData = dataSet.elements.x00281201;\n const lutBitsAllocated = lutData.length === numLutEntries ? 8 : 16;\n\n // If the descriptors do not appear to have the correct values, correct them\n if (\n imagePixelModule.redPaletteColorLookupTableDescriptor[2] !==\n lutBitsAllocated\n ) {\n imagePixelModule.redPaletteColorLookupTableDescriptor[2] = lutBitsAllocated;\n imagePixelModule.greenPaletteColorLookupTableDescriptor[2] =\n lutBitsAllocated;\n imagePixelModule.bluePaletteColorLookupTableDescriptor[2] =\n lutBitsAllocated;\n }\n\n imagePixelModule.redPaletteColorLookupTableData = getLutData(\n dataSet,\n 'x00281201',\n imagePixelModule.redPaletteColorLookupTableDescriptor\n );\n imagePixelModule.greenPaletteColorLookupTableData = getLutData(\n dataSet,\n 'x00281202',\n imagePixelModule.greenPaletteColorLookupTableDescriptor\n );\n imagePixelModule.bluePaletteColorLookupTableData = getLutData(\n dataSet,\n 'x00281203',\n imagePixelModule.bluePaletteColorLookupTableDescriptor\n );\n}\n\nfunction populateSmallestLargestPixelValues(\n dataSet: DataSet,\n imagePixelModule: Types.ImagePixelModuleMetadata\n) {\n const pixelRepresentation = dataSet.uint16('x00280103');\n\n if (pixelRepresentation === 0) {\n imagePixelModule.smallestPixelValue = dataSet.uint16('x00280106');\n imagePixelModule.largestPixelValue = dataSet.uint16('x00280107');\n } else {\n imagePixelModule.smallestPixelValue = dataSet.int16('x00280106');\n imagePixelModule.largestPixelValue = dataSet.int16('x00280107');\n }\n}\n\nfunction getImagePixelModule(dataSet: DataSet): Types.ImagePixelModuleMetadata {\n const imagePixelModule = {\n samplesPerPixel: dataSet.uint16('x00280002'),\n photometricInterpretation: dataSet.string('x00280004'),\n rows: dataSet.uint16('x00280010'),\n columns: dataSet.uint16('x00280011'),\n bitsAllocated: dataSet.uint16('x00280100'),\n bitsStored: dataSet.uint16('x00280101'),\n highBit: dataSet.uint16('x00280102'),\n pixelRepresentation: dataSet.uint16('x00280103'),\n planarConfiguration: dataSet.uint16('x00280006'),\n pixelAspectRatio: dataSet.string('x00280034'),\n } as Types.ImagePixelModuleMetadata;\n\n populateSmallestLargestPixelValues(dataSet, imagePixelModule);\n\n if (\n imagePixelModule.photometricInterpretation === 'PALETTE COLOR' &&\n dataSet.elements.x00281101\n ) {\n populatePaletteColorLut(dataSet, imagePixelModule);\n }\n\n return imagePixelModule;\n}\n\nexport default getImagePixelModule;\n","import type { DataSet, Element } from 'dicom-parser';\nimport type { LutType } from '../../../types';\n\nfunction getLUT(pixelRepresentation: number, lutDataSet: DataSet): LutType {\n let numLUTEntries = lutDataSet.uint16('x00283002', 0);\n\n if (numLUTEntries === 0) {\n numLUTEntries = 65535;\n }\n let firstValueMapped = 0;\n\n if (pixelRepresentation === 0) {\n firstValueMapped = lutDataSet.uint16('x00283002', 1);\n } else {\n firstValueMapped = lutDataSet.int16('x00283002', 1);\n }\n const numBitsPerEntry = lutDataSet.uint16('x00283002', 2);\n // console.log('LUT(', numLUTEntries, ',', firstValueMapped, ',', numBitsPerEntry, ')');\n const lut = {\n id: '1',\n firstValueMapped,\n numBitsPerEntry,\n lut: [],\n };\n\n // console.log(\"minValue=\", minValue, \"; maxValue=\", maxValue);\n for (let i = 0; i < numLUTEntries; i++) {\n if (pixelRepresentation === 0) {\n lut.lut[i] = lutDataSet.uint16('x00283006', i);\n } else {\n lut.lut[i] = lutDataSet.int16('x00283006', i);\n }\n }\n\n return lut;\n}\n\nfunction getLUTs(pixelRepresentation: number, lutSequence: Element): LutType[] {\n if (!lutSequence || !lutSequence.items || !lutSequence.items.length) {\n return;\n }\n const luts: LutType[] = [];\n\n for (let i = 0; i < lutSequence.items.length; i++) {\n const lutDataSet = lutSequence.items[i].dataSet;\n const lut = getLUT(pixelRepresentation, lutDataSet);\n\n if (lut) {\n luts.push(lut);\n }\n }\n\n return luts;\n}\n\nexport default getLUTs;\n","/* eslint no-bitwise: 0 */\n\nimport type { DataSet } from 'dicom-parser';\n\nfunction getMinStoredPixelValue(dataSet: DataSet) {\n const pixelRepresentation = dataSet.uint16('x00280103');\n const bitsStored = dataSet.uint16('x00280101');\n\n if (pixelRepresentation === 0) {\n return 0;\n }\n\n return -1 << (bitsStored - 1);\n}\n\n// 0 = unsigned / US, 1 = signed / SS\nfunction getModalityLUTOutputPixelRepresentation(dataSet: DataSet) {\n // CT SOP Classes are always signed\n const sopClassUID = dataSet.string('x00080016');\n\n if (\n sopClassUID === '1.2.840.10008.5.1.4.1.1.2' ||\n sopClassUID === '1.2.840.10008.5.1.4.1.1.2.1'\n ) {\n return 1;\n }\n\n // if rescale intercept and rescale slope are present, pass the minimum stored\n // pixel value through them to see if we get a signed output range\n const rescaleIntercept = dataSet.floatString('x00281052');\n const rescaleSlope = dataSet.floatString('x00281053');\n\n if (rescaleIntercept !== undefined && rescaleSlope !== undefined) {\n const minStoredPixelValue = getMinStoredPixelValue(dataSet); //\n const minModalityLutValue =\n minStoredPixelValue * rescaleSlope + rescaleIntercept;\n\n if (minModalityLutValue < 0) {\n return 1;\n }\n\n return 0;\n }\n\n // Output of non linear modality lut is always unsigned\n if (dataSet.elements.x00283000 && dataSet.elements.x00283000.length > 0) {\n return 0;\n }\n\n // If no modality lut transform, output is same as pixel representation\n return dataSet.uint16('x00280103');\n}\n\nexport default getModalityLUTOutputPixelRepresentation;\n","import type { DataSet } from 'dicom-parser';\n\nfunction getNumberValues(\n dataSet: DataSet,\n tag: string,\n minimumLength: number\n): number[] {\n const values = [];\n const valueAsString = dataSet.string(tag);\n\n if (!valueAsString) {\n return;\n }\n const split = valueAsString.split('\\\\');\n\n if (minimumLength && split.length < minimumLength) {\n return;\n }\n for (let i = 0; i < split.length; i++) {\n values.push(parseFloat(split[i]));\n }\n\n return values;\n}\n\nexport default getNumberValues;\n","export interface CornerstoneImageUrl {\n scheme: string;\n url: string;\n frame: number;\n pixelDataFrame: number;\n}\n\nfunction parseImageId(imageId: string): CornerstoneImageUrl {\n // build a url by parsing out the url scheme and frame index from the imageId\n const firstColonIndex = imageId.indexOf(':');\n\n let url = imageId.substring(firstColonIndex + 1);\n const frameIndex = url.indexOf('frame=');\n\n let frame;\n\n if (frameIndex !== -1) {\n const frameStr = url.substring(frameIndex + 6);\n\n frame = parseInt(frameStr, 10);\n url = url.substring(0, frameIndex - 1);\n }\n\n const scheme = imageId.substring(0, firstColonIndex);\n /**\n * Why we adjust frameNumber? since in the above we are extracting the\n * frame number from the imageId (from the metadata), and the frame number\n * starts from 1, but in the loader which uses the dicomParser\n * the frame number starts from 0.\n */\n\n const adjustedFrame = frame !== undefined ? frame - 1 : undefined;\n\n return {\n scheme,\n url,\n frame,\n pixelDataFrame: adjustedFrame,\n };\n}\n\nexport default parseImageId;\n","import type { LoaderOptions } from '../../types';\n\nlet options: LoaderOptions = {\n // callback to open the object\n open(xhr, url) {\n xhr.open('get', url, true);\n },\n // callback allowing customization of the xhr (e.g. adding custom auth headers, cors, etc)\n beforeSend(/* xhr, imageId */) {\n // before send code\n },\n // callback allowing modification of the xhr response before creating image objects\n beforeProcessing(xhr: XMLHttpRequest) {\n return Promise.resolve(xhr.response as ArrayBuffer);\n },\n // callback allowing modification of newly created image objects\n imageCreated(/* image */) {\n // image created code\n },\n strict: false,\n};\n\nexport function setOptions(newOptions: LoaderOptions): void {\n options = Object.assign(options, newOptions);\n}\n\nexport function getOptions(): LoaderOptions {\n return options;\n}\n","import { getOptions } from './options';\nimport type {\n LoaderXhrRequestError,\n LoaderXhrRequestParams,\n LoaderXhrRequestPromise,\n} from '../../types';\nimport { triggerEvent, eventTarget } from '@cornerstonejs/core';\n\nfunction xhrRequest(\n url: string,\n imageId: string,\n defaultHeaders: Record<string, string> = {},\n params: LoaderXhrRequestParams = {}\n): LoaderXhrRequestPromise<ArrayBuffer> {\n const options = getOptions();\n\n const errorInterceptor = (xhr: XMLHttpRequest) => {\n if (typeof options.errorInterceptor === 'function') {\n const error = new Error('request failed') as LoaderXhrRequestError;\n\n error.request = xhr;\n error.response = xhr.response;\n error.status = xhr.status;\n options.errorInterceptor(error);\n }\n };\n\n const xhr = new XMLHttpRequest();\n\n // Make the request for the DICOM P10 SOP Instance\n const promise: LoaderXhrRequestPromise<ArrayBuffer> =\n new Promise<ArrayBuffer>((resolve, reject) => {\n options.open(xhr, url, defaultHeaders, params);\n const beforeSendHeaders = options.beforeSend(\n xhr,\n imageId,\n defaultHeaders,\n params\n );\n\n xhr.responseType = 'arraybuffer';\n\n const headers = Object.assign({}, defaultHeaders, beforeSendHeaders);\n\n Object.keys(headers).forEach(function (key) {\n if (headers[key] === null) {\n return;\n }\n if (key === 'Accept' && url.indexOf('accept=') !== -1) {\n return;\n }\n xhr.setRequestHeader(key, headers[key]);\n });\n\n params.deferred = {\n resolve,\n reject,\n };\n params.url = url;\n params.imageId = imageId;\n\n // Event triggered when downloading an image starts\n xhr.onloadstart = function (event) {\n // Action\n if (options.onloadstart) {\n options.onloadstart(event, params);\n }\n\n // Event\n const eventData = {\n url,\n imageId,\n };\n\n triggerEvent(eventTarget, 'cornerstoneimageloadstart', eventData);\n };\n\n // Event triggered when downloading an image ends\n xhr.onloadend = function (event) {\n // Action\n if (options.onloadend) {\n options.onloadend(event, params);\n }\n\n const eventData = {\n url,\n imageId,\n };\n\n // Event\n triggerEvent(eventTarget, 'cornerstoneimageloadend', eventData);\n };\n\n // handle response data\n xhr.onreadystatechange = function (event) {\n // Action\n if (options.onreadystatechange) {\n options.onreadystatechange(event, params);\n\n return;\n }\n\n // Default action\n // TODO: consider sending out progress messages here as we receive\n // the pixel data\n if (xhr.readyState === 4) {\n // Status OK (200) and partial content (206) are both handled\n if (xhr.status === 200 || xhr.status === 206) {\n options\n .beforeProcessing(xhr)\n .then(resolve)\n .catch(() => {\n errorInterceptor(xhr);\n // request failed, reject the Promise\n reject(xhr);\n });\n } else {\n errorInterceptor(xhr);\n // request failed, reject the Promise\n reject(xhr);\n }\n }\n };\n\n // Event triggered when downloading an image progresses\n xhr.onprogress = function (oProgress) {\n // console.log('progress:',oProgress)\n const loaded = oProgress.loaded; // evt.loaded the bytes browser receive\n\n let total: number;\n\n let percentComplete: number;\n\n if (oProgress.lengthComputable) {\n total = oProgress.total; // evt.total the total bytes seted by the header\n percentComplete = Math.round((loaded / total) * 100);\n }\n\n // Action\n if (options.onprogress) {\n options.onprogress(oProgress, params);\n }\n };\n xhr.onerror = function () {\n errorInterceptor(xhr);\n reject(xhr);\n };\n\n xhr.onabort = function () {\n errorInterceptor(xhr);\n reject(xhr);\n };\n xhr.send();\n });\n\n promise.xhr = xhr;\n\n return promise;\n}\n\nexport default xhrRequest;\n","function checkToken(token, data, dataOffset): boolean {\n if (dataOffset + token.length > data.length) {\n return false;\n }\n\n let endIndex = dataOffset;\n\n for (let i = 0; i < token.length; i++) {\n if (token[i] !== data[endIndex++]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction stringToUint8Array(str: string): Uint8Array {\n const uint = new Uint8Array(str.length);\n\n for (let i = 0, j = str.length; i < j; i++) {\n uint[i] = str.charCodeAt(i);\n }\n\n return uint;\n}\n\nfunction findIndexOfString(\n data: Uint8Array,\n str: string,\n offset?: number\n): number {\n offset = offset || 0;\n\n const token = stringToUint8Array(str);\n\n for (let i = offset; i < data.length; i++) {\n if (token[0] === data[i]) {\n // console.log('match @', i);\n if (checkToken(token, data, i)) {\n return i;\n }\n }\n }\n\n return -1;\n}\nexport default findIndexOfString;\n","import { Enums } from '@cornerstonejs/core';\nimport findIndexOfString from './findIndexOfString';\n\nconst { ImageQualityStatus } = Enums;\n/**\n * Extracts multipart/related data or single part data from a response byte\n * array.\n *\n * @param contentType - guess of the root content type\n * @param imageFrameAsArrayBuffer - array buffer containing the image frame\n * @param options - contains already computed values from\n * earlier calls, allowing additional calls to be made to fetch\n * additional data.\n * @param isPartial - indicates the file may end partially\n * @returns a compressed image frame containing the pixel data.\n */\nexport default function extractMultipart(\n contentType: string,\n imageFrameAsArrayBuffer,\n options?\n) {\n options ||= {};\n // request succeeded, Parse the multi-part mime response\n const response = new Uint8Array(imageFrameAsArrayBuffer);\n const isPartial = !!options?.isPartial;\n if (contentType.indexOf('multipart') === -1) {\n return {\n contentType,\n imageQualityStatus: isPartial\n ? ImageQualityStatus.SUBRESOLUTION\n : ImageQualityStatus.FULL_RESOLUTION,\n pixelData: response,\n };\n }\n\n let { tokenIndex, responseHeaders, boundary, multipartContentType } = options;\n\n // First look for the multipart mime header\n tokenIndex ||= findIndexOfString(response, '\\r\\n\\r\\n');\n\n if (tokenIndex === -1) {\n throw new Error('invalid response - no multipart mime header');\n }\n\n if (!boundary) {\n const header = uint8ArrayToString(response, 0, tokenIndex);\n // Now find the boundary marker\n responseHeaders = header.split('\\r\\n');\n boundary = findBoundary(responseHeaders);\n\n if (!boundary) {\n throw new Error('invalid response - no boundary marker');\n }\n }\n const offset = tokenIndex + 4; // skip over the \\r\\n\\r\\n\n\n // find the terminal boundary marker\n const endIndex = findIndexOfString(response, boundary, offset);\n\n if (endIndex === -1 && !isPartial) {\n throw new Error('invalid response - terminating boundary not found');\n }\n\n multipartContentType ||= findContentType(responseHeaders);\n\n options.tokenIndex = tokenIndex;\n options.boundary = boundary;\n options.responseHeaders = responseHeaders;\n options.multipartContentType = multipartContentType;\n options.isPartial = endIndex === -1;\n\n // return the info for this pixel data\n return {\n contentType: multipartContentType,\n // done indicates if the read has finished the entire image, not if\n // the image is completely available\n extractDone: !isPartial || endIndex !== -1,\n tokenIndex,\n responseHeaders,\n boundary,\n multipartContentType,\n // Exclude the \\r\\n as well as the boundary\n pixelData: imageFrameAsArrayBuffer.slice(offset, endIndex - 2),\n };\n}\n\nexport function findBoundary(header: string[]): string {\n for (let i = 0; i < header.length; i++) {\n if (header[i].substr(0, 2) === '--') {\n return header[i];\n }\n }\n}\n\nexport function findContentType(header: string[]): string {\n for (let i = 0; i < header.length; i++) {\n if (header[i].substr(0, 13) === 'Content-Type:') {\n return header[i].substr(13).trim();\n }\n }\n}\n\nexport function uint8ArrayToString(data, offset, length) {\n offset = offset || 0;\n length = length || data.length - offset;\n let str = '';\n\n for (let i = offset; i < offset + length; i++) {\n str += String.fromCharCode(data[i]);\n }\n\n return str;\n}\n","import type { Types } from '@cornerstonejs/core';\nimport { Enums } from '@cornerstonejs/core';\n\nconst { ImageQualityStatus } = Enums;\n\n/** Gets the status of returned images */\nexport function getImageQualityStatus(\n retrieveOptions: Types.RetrieveOptions,\n done = true\n) {\n if (!done) {\n return ImageQualityStatus.SUBRESOLUTION;\n }\n return (\n retrieveOptions.imageQualityStatus ?? ImageQualityStatus.FULL_RESOLUTION\n );\n}\n","import type { Types } from '@cornerstonejs/core';\nimport { utilities } from '@cornerstonejs/core';\nimport { getOptions } from './options';\nimport type { LoaderXhrRequestError } from '../../types';\nimport extractMultipart from '../wadors/extractMultipart';\nimport { getImageQualityStatus } from '../wadors/getImageQualityStatus';\nimport type {\n CornerstoneWadoRsLoaderOptions,\n StreamingData,\n} from '../wadors/loadImage';\n\nconst { ProgressiveIterator } = utilities;\n\n/**\n * This function does a streaming parse from an http request, delivering\n * combined/subsequent parts of the result as iterations on a\n * ProgressiveIterator instance.\n *\n * @param url - to request and parse as either multipart or singlepart.\n * @param imageId - the imageId to be used in the returned detail object\n * @param defaultHeaders\n * @returns\n */\nexport default function streamRequest(\n url: string,\n imageId: string,\n defaultHeaders: Record<string, string> = {},\n options: CornerstoneWadoRsLoaderOptions = {}\n) {\n const globalOptions = getOptions();\n const {\n retrieveOptions = {} as Types.RangeRetrieveOptions,\n streamingData = {} as StreamingData,\n } = options;\n\n // @ts-expect-error\n const minChunkSize = retrieveOptions.minChunkSize || 128 * 1024;\n\n const errorInterceptor = (err) => {\n if (typeof globalOptions.errorInterceptor === 'function') {\n const error = new Error('request failed') as LoaderXhrRequestError;\n globalOptions.errorInterceptor(error);\n }\n };\n\n // Make the request for the streamable image frame (i.e. HTJ2K)\n const loadIterator = new ProgressiveIterator('streamRequest');\n loadIterator.generate(async (iterator, reject) => {\n const beforeSendHeaders = globalOptions.beforeSend?.(\n null,\n url,\n defaultHeaders,\n {}\n );\n const headers = Object.assign({}, defaultHeaders, beforeSendHeaders);\n\n Object.keys(headers).forEach(function (key) {\n if (headers[key] === null) {\n headers[key] = undefined;\n }\n if (key === 'Accept' && url.indexOf('accept=') !== -1) {\n headers[key] = undefined;\n }\n });\n\n try {\n const response = await fetch(url, {\n headers,\n signal: undefined,\n });\n\n // Response is expected to be a 200 status response\n if (response.status !== 200) {\n throw new Error(\n `Couldn't retrieve ${url} got status ${response.status}`\n );\n }\n const responseReader = response.body.getReader();\n const responseHeaders = response.headers;\n\n const contentType = responseHeaders.get('content-type');\n\n const totalBytes = Number(responseHeaders.get('Content-Length'));\n\n let readDone = false;\n let encodedData = streamingData.encodedData;\n // @ts-ignore\n let lastSize = streamingData.lastSize || 0;\n // @ts-ignore\n streamingData.isPartial = true;\n\n while (!readDone) {\n const { done, value } = await responseReader.read();\n encodedData = appendChunk(encodedData, value);\n if (!encodedData) {\n if (readDone) {\n throw new Error(`Done but no image frame available ${imageId}`);\n }\n continue;\n }\n readDone = done || encodedData.byteLength === totalBytes;\n if (!readDone && encodedData.length < lastSize + minChunkSize) {\n continue;\n }\n lastSize = encodedData.length;\n // @ts-ignore\n streamingData.isPartial = !done;\n const extracted = extractMultipart(\n contentType,\n encodedData,\n streamingData\n );\n const imageQualityStatus = getImageQualityStatus(\n retrieveOptions,\n readDone\n );\n const detail = {\n url,\n imageId,\n ...extracted,\n percentComplete: done\n ? 100\n : (extracted.pixelData?.length * 100) / totalBytes,\n imageQualityStatus,\n done: readDone,\n };\n\n // All of the image load events will be handled by the imageLoader\n // this simply delivers the raw data as it becomes available.\n iterator.add(detail, readDone);\n }\n } catch (err) {\n errorInterceptor(err);\n console.error(err);\n reject(err);\n }\n });\n\n return loadIterator.getNextPromise();\n}\n\nfunction appendChunk(existing: Uint8Array, chunk?: Uint8Array) {\n // that imageId\n if (!existing) {\n return chunk;\n }\n if (!chunk) {\n return existing;\n }\n const newDataArray = new Uint8Array(existing.length + chunk.length);\n newDataArray.set(existing, 0);\n newDataArray.set(chunk, existing.length);\n return newDataArray;\n}\n","import { default as xhrRequest } from './xhrRequest';\nimport { default as streamRequest } from './streamRequest';\nimport { setOptions, getOptions } from './options';\n\nconst internal = {\n xhrRequest,\n streamRequest,\n setOptions,\n getOptions,\n};\n\nexport { setOptions, getOptions, xhrRequest, internal, streamRequest };\n","import type { DataSet } from 'dicom-parser';\nimport * as dicomParser from 'dicom-parser';\nimport type {\n LoadRequestFunction,\n DICOMLoaderDataSetWithFetchMore,\n} from '../../types';\n\nfunction fixFragments(dataSet: DataSet) {\n // The partially parsed pixelData element has incorrect fragment\n // lengths because the byte array is truncated, so we manually set\n // it to the actual length.\n const fragments = dataSet.elements.x7fe00010.fragments;\n const totalLength = dataSet.byteArray.length;\n\n for (const fragment of fragments) {\n const { position, length } = fragment;\n\n if (length > totalLength - position) {\n console.log(\n `Truncated fragment, changing fragment length from ${\n fragment.length\n } to ${totalLength - position}`\n );\n fragment.length = totalLength - position;\n }\n }\n\n return dataSet;\n}\n\nfunction parsePartialByteArray(byteArray: Uint8Array) {\n /**\n * First parse just up to pixelData. This will make sure the\n * metadata header is correctly parsed (assuming no other error is\n * thrown during parsing). Then, parse again using the whole partial\n * arraybuffer. This will error, but still kick out the parsed\n * partial pixel data in the error object.\n */\n\n let dataSet = dicomParser.parseDicom(byteArray, {\n untilTag: 'x7fe00010',\n });\n\n if (!dataSet.elements.x7fe00010) {\n console.warn('Pixel data not found!');\n // Re-fetch more of the file\n }\n\n let pixelDataSet: DataSet;\n\n try {\n // This is expected to fail, since the file is incomplete, but\n // dicomParser helpfully spits out the parsed partial dataset in\n // the error object. The problem is, the dataset here is\n // incomplete, because dicomParser throws *before* combining the\n // metadata header and regular datasets, so transfer syntax and\n // other metadata headers aren't included.\n pixelDataSet = dicomParser.parseDicom(byteArray);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n // Todo: This is probably invalid handling - it expects the only reason to\n // fail is a partial dataset\n console.error(err);\n console.log('pixel data dataset:', err.dataSet);\n pixelDataSet = err.dataSet;\n }\n\n // Add the parsed partial pixel data element to the dataset\n // including the metadata headers.\n dataSet.elements.x7fe00010 = pixelDataSet.elements.x7fe00010;\n\n dataSet = fixFragments(dataSet);\n\n return dataSet;\n}\n\nexport default async function dataSetFromPartialContent(\n byteArray: Uint8Array,\n loadRequest: LoadRequestFunction,\n metadata: {\n uri: string;\n imageId: string;\n fileTotalLength: number | null;\n }\n): Promise<DICOMLoaderDataSetWithFetchMore> {\n const dataSet: DICOMLoaderDataSetWithFetchMore =\n parsePartialByteArray(byteArray);\n const { uri, imageId, fileTotalLength } = metadata;\n\n // Allow re-fetching of more of the file\n dataSet.fetchMore = async function (fetchOptions) {\n // Default to fetching the rest of the file if no lengthToFetch is set. Also\n // default to fetching the same URI/imageId\n const _options = Object.assign(\n {\n uri,\n imageId,\n fetchedLength: byteArray.length, // Not sure if this would ever need to be configurable tbh\n lengthToFetch: fileTotalLength - byteArray.length,\n },\n fetchOptions\n );\n const { fetchedLength, lengthToFetch } = _options;\n\n // Use passed xhr loader to re-fetch new byte range\n\n // Todo: the following might be wrong, does it return array buffer or\n // something else?\n // @ts-ignore\n const { arrayBuffer } = await loadRequest(uri, imageId, {\n byteRange: `${fetchedLength}-${fetchedLength + lengthToFetch}`,\n });\n\n // Combine byte ranges\n const byteArrayToAppend = new Uint8Array(arrayBuffer);\n const combinedByteArray = new Uint8Array(\n dataSet.byteArray.length + byteArrayToAppend.length\n );\n\n combinedByteArray.set(dataSet.byteArray);\n combinedByteArray.set(byteArrayToAppend, dataSet.byteArray.length);\n\n // Re-parse potentially partial byte range and return\n return dataSetFromPartialContent(combinedByteArray, loadRequest, metadata);\n };\n\n return dataSet;\n}\n","function getDirectFrameInformation(dataSet, frame) {\n if (!dataSet) {\n return;\n }\n\n const {\n NumberOfFrames,\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n } = getMultiframeInformation(dataSet);\n\n if (PerFrameFunctionalGroupsSequence || NumberOfFrames > 1) {\n const { shared, perFrame } = getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frame\n );\n\n return {\n NumberOfFrames,\n PerFrameFunctionalInformation: perFrame,\n SharedFunctionalInformation: shared,\n };\n }\n\n return {\n NumberOfFrames,\n };\n}\n\nfunction getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frameNumber\n) {\n const shared = {};\n\n (SharedFunctionalGroupsSequence\n ? Object.values(SharedFunctionalGroupsSequence.items[0].dataSet.elements)\n : []\n )\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((it: any) => (shared[it.tag] = it));\n\n const perFrame = {};\n\n (PerFrameFunctionalGroupsSequence\n ? Object.values(\n PerFrameFunctionalGroupsSequence.items[frameNumber - 1].dataSet.elements\n )\n : []\n )\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((it: any) => (perFrame[it.tag] = it));\n\n return {\n shared,\n perFrame,\n };\n}\n\nfunction getMultiframeInformation(dataSet) {\n if (!dataSet) {\n return;\n }\n const { elements, ...otherAttributtes } = dataSet;\n const {\n x52009230: PerFrameFunctionalGroupsSequence,\n x52009229: SharedFunctionalGroupsSequence,\n ...otherElements\n } = elements;\n\n const NumberOfFrames = dataSet.intString('x00280008');\n\n return {\n NumberOfFrames,\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n otherElements,\n otherAttributtes,\n };\n}\n\n// function that retrieves specific frame metadata information from multiframe\n// metadata\nfunction combineFrameInstanceDataset(frameNumber, dataSet) {\n if (!dataSet) {\n return;\n }\n\n const {\n NumberOfFrames,\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n otherElements,\n } = getMultiframeInformation(dataSet);\n\n if (PerFrameFunctionalGroupsSequence || NumberOfFrames > 1) {\n const { shared, perFrame } = getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frameNumber\n );\n\n // creating a new copy of the dataset to remove the two multiframe dicom tags\n const newElements = {\n elements: {\n ...otherElements,\n ...shared,\n ...perFrame,\n },\n };\n\n const clonedDataset = Object.create(dataSet);\n const newDataset = Object.assign(clonedDataset, newElements);\n\n return newDataset;\n }\n\n return dataSet;\n}\n\nexport {\n combineFrameInstanceDataset,\n getMultiframeInformation,\n getFrameInformation,\n getDirectFrameInformation,\n};\n","import type { DataSet } from 'dicom-parser';\n\nlet loadedDataSets: Record<string, { dataSet: DataSet; cacheCount: number }> =\n {};\n\nconst purgeLoadedDataSets = () => {\n loadedDataSets = {};\n};\nexport { loadedDataSets, purgeLoadedDataSets };\n","import { loadedDataSets } from './loadedDataSets';\n\nfunction _get(uri) {\n if (!loadedDataSets[uri]) {\n return;\n }\n\n return loadedDataSets[uri];\n}\n\nfunction isMultiframeDataset(uri) {\n const dataSet = _get(uri);\n\n return _isMultiframeDataset(dataSet);\n}\n\nfunction _isMultiframeDataset(dataSet) {\n // Checks if dicomTag NumberOf Frames exists and it is greater than one\n if (!dataSet) {\n return false;\n }\n\n const numberOfFrames = dataSet.intString('x00280008');\n\n return numberOfFrames && numberOfFrames > 1;\n}\n\nfunction retrieveFrameParameterIndex(uri) {\n return uri.indexOf('&frame=');\n}\n\nfunction retrieveMultiframeDataset(uri) {\n const frameParameterIndex = retrieveFrameParameterIndex(uri);\n const multiframeURI =\n frameParameterIndex === -1 ? uri : uri.slice(0, frameParameterIndex);\n const frame = parseInt(uri.slice(frameParameterIndex + 7), 10) || 1;\n\n let dataSet;\n\n if (loadedDataSets[multiframeURI]) {\n dataSet = loadedDataSets[multiframeURI].dataSet;\n } else {\n dataSet = undefined;\n }\n\n return {\n dataSet,\n frame,\n };\n}\n\nfunction generateMultiframeWADOURIs(uri) {\n const listWADOURIs = [];\n\n const dataSet = _get(uri);\n\n if (_isMultiframeDataset(dataSet)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const numberOfFrames = (dataSet as any).intString('x00280008');\n\n for (let i = 1; i <= numberOfFrames; i++) {\n listWADOURIs.push(`${uri}&frame=${i}`);\n }\n } else {\n listWADOURIs.push(uri);\n }\n\n return listWADOURIs;\n}\n\nexport default {\n _get,\n generateMultiframeWADOURIs,\n retrieveMultiframeDataset,\n isMultiframeDataset,\n};\n","import type { DataSet } from 'dicom-parser';\nimport * as dicomParser from 'dicom-parser';\nimport { xhrRequest } from '../internal/index';\nimport dataSetFromPartialContent from './dataset-from-partial-content';\nimport type {\n LoadRequestFunction,\n DICOMLoaderDataSetWithFetchMore,\n} from '../../types';\nimport { combineFrameInstanceDataset } from './combineFrameInstanceDataset';\nimport multiframeDataset from './retrieveMultiframeDataset';\nimport { loadedDataSets, purgeLoadedDataSets } from './loadedDataSets';\nimport { eventTarget, triggerEvent } from '@cornerstonejs/core';\n\nexport interface CornerstoneWadoLoaderCacheManagerInfoResponse {\n cacheSizeInBytes: number;\n numberOfDataSetsCached: number;\n}\n\nexport interface CornerstoneWadoLoaderCachedPromise\n extends Promise<DataSet | DICOMLoaderDataSetWithFetchMore> {\n cacheCount?: number;\n}\n\n/**\n * This object supports loading of DICOM P10 dataset from a uri and caching it so it can be accessed\n * by the caller. This allows a caller to access the datasets without having to go through cornerstone's\n * image loader mechanism. One reason a caller may need to do this is to determine the number of frames\n * in a multiframe sop instance so it can create the imageId's correctly.\n */\nlet cacheSizeInBytes = 0;\n\nlet promises: Record<string, CornerstoneWadoLoaderCachedPromise> = {};\n\n// returns true if the wadouri for the specified index has been loaded\nfunction isLoaded(uri: string): boolean {\n return loadedDataSets[uri] !== undefined;\n}\n\nfunction get(uri: string): DataSet {\n let dataSet;\n\n if (uri.includes('&frame=')) {\n const { frame, dataSet: multiframeDataSet } =\n multiframeDataset.retrieveMultiframeDataset(uri);\n\n dataSet = combineFrameInstanceDataset(frame, multiframeDataSet);\n } else if (loadedDataSets[uri]) {\n dataSet = loadedDataSets[uri].dataSet;\n }\n\n return dataSet;\n}\n\nfunction update(uri: string, dataSet: DataSet) {\n const loadedDataSet = loadedDataSets[uri];\n\n if (!loadedDataSet) {\n console.error(`No loaded dataSet for uri ${uri}`);\n\n return;\n }\n // Update dataset\n cacheSizeInBytes -= loadedDataSet.dataSet.byteArray.length;\n loadedDataSet.dataSet = dataSet;\n cacheSizeInBytes += dataSet.byteArray.length;\n\n triggerEvent(eventTarget, 'datasetscachechanged', {\n uri,\n action: 'updated',\n cacheInfo: getInfo(),\n });\n}\n\n// loads the dicom dataset from the wadouri sp\nfunction load(\n uri: string,\n loadRequest: LoadRequestFunction = xhrRequest as LoadRequestFunction,\n imageId: string\n): CornerstoneWadoLoaderCachedPromise {\n // if already loaded return it right away\n if (loadedDataSets[uri]) {\n // console.log('using loaded dataset ' + uri);\n return new Promise((resolve) => {\n loadedDataSets[uri].cacheCount++;\n resolve(loadedDataSets[uri].dataSet);\n });\n }\n\n // if we are currently loading this uri, increment the cacheCount and return its promise\n if (promises[uri]) {\n // console.log('returning existing load promise for ' + uri);\n promises[uri].cacheCount++;\n\n return promises[uri];\n }\n\n // This uri is not loaded or being loaded, load it via an xhrRequest\n const loadDICOMPromise = loadRequest(uri, imageId);\n\n // handle success and failure of the XHR request load\n const promise: CornerstoneWadoLoaderCachedPromise = new Promise(\n (resolve, reject) => {\n loadDICOMPromise\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then(async function (dicomPart10AsArrayBuffer: any /* , xhr*/) {\n const partialContent = {\n isPartialContent: false,\n fileTotalLength: null,\n };\n\n // Allow passing extra data with the loader promise so as not to change\n // the API\n if (!(dicomPart10AsArrayBuffer instanceof ArrayBuffer)) {\n if (!dicomPart10AsArrayBuffer.arrayBuffer) {\n return reject(\n new Error(\n 'If not returning ArrayBuffer, must return object with `arrayBuffer` parameter'\n )\n );\n }\n partialContent.isPartialContent =\n dicomPart10AsArrayBuffer.flags.isPartialContent;\n partialContent.fileTotalLength =\n dicomPart10AsArrayBuffer.flags.fileTotalLength;\n dicomPart10AsArrayBuffer = dicomPart10AsArrayBuffer.arrayBuffer;\n }\n\n const byteArray = new Uint8Array(dicomPart10AsArrayBuffer);\n\n // Reject the promise if parsing the dicom file fails\n let dataSet: DataSet | DICOMLoaderDataSetWithFetchMore;\n\n try {\n if (partialContent.isPartialContent) {\n // This dataSet object will include a fetchMore function,\n dataSet = await dataSetFromPartialContent(\n byteArray,\n loadRequest,\n {\n uri,\n imageId,\n fileTotalLength: partialContent.fileTotalLength,\n }\n );\n } else {\n dataSet = dicomParser.parseDicom(byteArray);\n }\n } catch (error) {\n return reject(error);\n }\n\n loadedDataSets[uri] = {\n dataSet,\n cacheCount: promise.cacheCount,\n };\n cacheSizeInBytes += dataSet.byteArray.length;\n resolve(dataSet);\n\n triggerEvent(eventTarget, 'datasetscachechanged', {\n uri,\n action: 'loaded',\n cacheInfo: getInfo(),\n });\n }, reject)\n .then(\n () => {\n // Remove the promise if success\n delete promises[uri];\n },\n () => {\n // Remove the promise if failure\n delete promises[uri];\n }\n );\n }\n );\n\n promise.cacheCount = 1;\n\n promises[uri] = promise;\n\n return promise;\n}\n\n// remove the cached/loaded dicom dataset for the specified wadouri to free up memory\nfunction unload(uri: string): void {\n // console.log('unload for ' + uri);\n if (loadedDataSets[uri]) {\n loadedDataSets[uri].cacheCount--;\n if (loadedDataSets[uri].cacheCount === 0) {\n // console.log('removing loaded dataset for ' + uri);\n cacheSizeInBytes -= loadedDataSets[uri].dataSet.byteArray.length;\n delete loadedDataSets[uri];\n\n triggerEvent(eventTarget, 'datasetscachechanged', {\n uri,\n action: 'unloaded',\n cacheInfo: getInfo(),\n });\n }\n }\n}\n\nexport function getInfo(): CornerstoneWadoLoaderCacheManagerInfoResponse {\n return {\n cacheSizeInBytes,\n numberOfDataSetsCached: Object.keys(loadedDataSets).length,\n };\n}\n\n// removes all cached datasets from memory\nfunction purge(): void {\n purgeLoadedDataSets();\n promises = {};\n cacheSizeInBytes = 0;\n}\n\nexport default {\n isLoaded,\n load,\n unload,\n getInfo,\n purge,\n get,\n update,\n};\n\nexport { loadedDataSets };\n","export default function isNMReconstructable(imageSubType) {\n return imageSubType === 'RECON TOMO' || imageSubType === 'RECON GATED TOMO';\n}\n","import getNumberValues from './getNumberValues';\nimport isNMReconstructable from '../../isNMReconstructable';\n\n/**\n * Get a subpart of Image Type dicom tag defined by index\n * @param {*} dataSet\n * @param {*} index 0 based index of the subtype\n */\nfunction getImageTypeSubItemFromDataset(dataSet, index) {\n const imageType = dataSet.string('x00080008');\n\n if (imageType) {\n const subTypes = imageType.split('\\\\');\n\n if (subTypes.length > index) {\n return subTypes[index];\n }\n }\n\n return undefined;\n}\n/**\n * Extracts the orientation from NM multiframe dataset, if image type\n * equal to RECON TOMO or RECON GATED TOMO\n * @param {*} dataSet\n * @returns\n */\nfunction extractOrientationFromNMMultiframeDataset(dataSet) {\n let imageOrientationPatient;\n const modality = dataSet.string('x00080060');\n\n if (modality?.includes('NM')) {\n const imageSubType = getImageTypeSubItemFromDataset(dataSet, 2);\n\n if (imageSubType && isNMReconstructable(imageSubType)) {\n if (dataSet.elements.x00540022) {\n imageOrientationPatient = getNumberValues(\n dataSet.elements.x00540022.items[0].dataSet,\n 'x00200037',\n 6\n );\n }\n }\n }\n\n return imageOrientationPatient;\n}\n\n/**\n * Extracts the position from NM multiframe dataset, if image type\n * equal to RECON TOMO or RECON GATED TOMO\n * @param {*} dataSet\n * @returns\n */\nfunction extractPositionFromNMMultiframeDataset(dataSet) {\n let imagePositionPatient;\n const modality = dataSet.string('x00080060');\n\n if (modality?.includes('NM')) {\n const imageSubType = getImageTypeSubItemFromDataset(dataSet, 2);\n\n if (imageSubType && isNMReconstructable(imageSubType)) {\n if (dataSet.elements.x00540022) {\n imagePositionPatient = getNumberValues(\n dataSet.elements.x00540022.items[0].dataSet,\n 'x00200032',\n 3\n );\n }\n }\n }\n\n return imagePositionPatient;\n}\n\n/**\n * Extract orientation information from a dataset. It tries to get the orientation\n * from the Detector Information Sequence (for NM images) if image type equal\n * to RECON TOMO or RECON GATED TOMO\n * @param {*} dataSet\n * @returns\n */\nfunction extractOrientationFromDataset(dataSet) {\n let imageOrientationPatient = getNumberValues(dataSet, 'x00200037', 6);\n\n // Trying to get the orientation from the Plane Orientation Sequence\n if (!imageOrientationPatient && dataSet.elements.x00209116) {\n imageOrientationPatient = getNumberValues(\n dataSet.elements.x00209116.items[0].dataSet,\n 'x00200037',\n 6\n );\n }\n\n // If orientation not valid to this point, trying to get the orientation\n // from the Detector Information Sequence (for NM images) with image type\n // equal to RECON TOMO or RECON GATED TOMO\n\n if (!imageOrientationPatient) {\n imageOrientationPatient =\n extractOrientationFromNMMultiframeDataset(dataSet);\n }\n\n return imageOrientationPatient;\n}\n\n/**\n * Extract position information from a dataset. It tries to get the position\n * from the Detector Information Sequence (for NM images) if image type equal\n * to RECON TOMO or RECON GATED TOMO\n * @param {*} dataSet\n * @returns\n */\nfunction extractPositionFromDataset(dataSet) {\n let imagePositionPatient = getNumberValues(dataSet, 'x00200032', 3);\n\n // Trying to get the position from the Plane Position Sequence\n if (!imagePositionPatient && dataSet.elements.x00209113) {\n imagePositionPatient = getNumberValues(\n dataSet.elements.x00209113.items[0].dataSet,\n 'x00200032',\n 3\n );\n }\n\n // If position not valid to this point, trying to get the position\n // from the Detector Information Sequence (for NM images)\n if (!imagePositionPatient) {\n imagePositionPatient = extractPositionFromNMMultiframeDataset(dataSet);\n }\n\n return imagePositionPatient;\n}\n\n/**\n * Extract the pixelSpacing information. If exists, extracts this information\n * from Pixel Measures Sequence\n * @param {*} dataSet\n * @returns\n */\nfunction extractSpacingFromDataset(dataSet) {\n let pixelSpacing = getNumberValues(dataSet, 'x00280030', 2);\n\n // If pixelSpacing not valid to this point, trying to get the spacing\n // from the Pixel Measures Sequence\n if (!pixelSpacing && dataSet.elements.x00289110) {\n pixelSpacing = getNumberValues(\n dataSet.elements.x00289110.items[0].dataSet,\n 'x00280030',\n 2\n );\n }\n\n return pixelSpacing;\n}\n\n/**\n * Extract the sliceThickness information. If exists, extracts this information\n * from Pixel Measures Sequence\n * @param {*} dataSet\n * @returns\n */\nfunction extractSliceThicknessFromDataset(dataSet) {\n let sliceThickness;\n\n if (dataSet.elements.x00180050) {\n sliceThickness = dataSet.floatString('x00180050');\n } else if (\n dataSet.elements.x00289110 &&\n dataSet.elements.x00289110.items.length &&\n dataSet.elements.x00289110.items[0].dataSet.elements.x00180050\n ) {\n sliceThickness =\n dataSet.elements.x00289110.items[0].dataSet.floatString('x00180050');\n }\n\n return sliceThickness;\n}\n\nexport {\n getImageTypeSubItemFromDataset,\n extractOrientationFromDataset,\n extractPositionFromDataset,\n extractSpacingFromDataset,\n extractSliceThicknessFromDataset,\n};\n","/**\n * Retrieves metadata from a DICOM image and returns it as an object with capitalized keys.\n * @param imageId - the imageId\n * @param metaDataProvider - The metadata provider either wadors or wadouri\n * @param types - An array of metadata types to retrieve.\n * @returns An object containing the retrieved metadata with capitalized keys.\n */\nfunction getInstanceModule(imageId, metaDataProvider, types) {\n const result = {};\n for (const t of types) {\n try {\n const data = metaDataProvider(t, imageId);\n if (data) {\n const capitalizedData = {};\n for (const key in data) {\n if (key in data) {\n // each tag should get capitalized to match dcmjs style. Todo: move all of the tags to dcmjs style\n const capitalizedKey = capitalizeTag(key);\n capitalizedData[capitalizedKey] = data[key];\n }\n }\n Object.assign(result, capitalizedData);\n }\n } catch (error) {\n console.error(`Error retrieving ${t} data:`, error);\n }\n }\n\n return result;\n}\n\nconst capitalizeTag = (tag: string) =>\n tag.charAt(0).toUpperCase() + tag.slice(1);\n\nconst instanceModuleNames = [\n 'multiframeModule',\n 'generalSeriesModule',\n 'patientStudyModule',\n 'imagePlaneModule',\n 'nmMultiframeGeometryModule',\n 'imagePixelModule',\n 'modalityLutModule',\n 'voiLutModule',\n 'sopCommonModule',\n 'petIsotopeModule',\n 'overlayPlaneModule',\n 'transferSyntax',\n 'petSeriesModule',\n 'petImageModule',\n];\n\nexport { getInstanceModule, instanceModuleNames };\n","/**\n * This function retrieves the ultrasound regions from the provided metadata.\n * @param metadata - The metadata from which to retrieve the ultrasound regions.\n * @returns An array of ultrasound regions, or null if no regions are found.\n */\n\nfunction getUSEnhancedRegions(metadata) {\n const sequence = metadata.elements['x00186011'];\n if (!sequence || !sequence.items) {\n return [];\n }\n\n const regions = sequence.items.map((item) => {\n const physicalDeltaX = item.dataSet.double('x0018602c');\n const physicalDeltaY = item.dataSet.double('x0018602e');\n const physicalUnitsXDirection = item.dataSet.uint16('x00186024');\n const physicalUnitsYDirection = item.dataSet.uint16('x00186026');\n\n const regionLocationMinY0 = item.dataSet.uint16('x0018601a');\n const regionLocationMaxY1 = item.dataSet.uint16('x0018601e');\n const regionLocationMinX0 = item.dataSet.uint16('x00186018');\n const regionLocationMaxX1 = item.dataSet.uint16('x0018601c');\n const referencePixelX0 = item.dataSet.int32('x00186020') || null;\n const referencePixelY0 = item.dataSet.int32('x00186022') || null;\n\n const referencePhysicalPixelValueY = item.dataSet.uint16('x0018602a');\n const referencePhysicalPixelValueX = item.dataSet.uint16('x00186028');\n const regionSpatialFormat = item.dataSet.uint16('x00186012');\n\n const regionDataType = item.dataSet.uint16('x00186014');\n const regionFlags = item.dataSet.uint16('x00186016');\n const transducerFrequency = item.dataSet.uint16('x00186030');\n return {\n regionLocationMinY0,\n regionLocationMaxY1,\n regionLocationMinX0,\n regionLocationMaxX1,\n referencePixelX0,\n referencePixelY0,\n physicalDeltaX,\n physicalDeltaY,\n physicalUnitsXDirection,\n physicalUnitsYDirection,\n referencePhysicalPixelValueY,\n referencePhysicalPixelValueX,\n regionSpatialFormat,\n regionDataType,\n regionFlags,\n transducerFrequency,\n };\n });\n\n return regions;\n}\n\nexport { getUSEnhancedRegions };\n","import { Enums } from '@cornerstonejs/core';\nimport * as dicomParser from 'dicom-parser';\nimport getNumberValues from './getNumberValues';\nimport parseImageId from '../parseImageId';\nimport dataSetCacheManager from '../dataSetCacheManager';\nimport getImagePixelModule from './getImagePixelModule';\nimport getOverlayPlaneModule from './getOverlayPlaneModule';\nimport getLUTs from './getLUTs';\nimport getModalityLUTOutputPixelRepresentation from './getModalityLUTOutputPixelRepresentation';\nimport { getDirectFrameInformation } from '../combineFrameInstanceDataset';\nimport multiframeDataset from '../retrieveMultiframeDataset';\nimport {\n getImageTypeSubItemFromDataset,\n extractOrientationFromDataset,\n extractPositionFromDataset,\n extractSpacingFromDataset,\n extractSliceThicknessFromDataset,\n} from './extractPositioningFromDataset';\nimport isNMReconstructable from '../../isNMReconstructable';\nimport {\n getInstanceModule,\n instanceModuleNames,\n} from '../../getInstanceModule';\nimport { getUSEnhancedRegions } from './USHelpers';\n\nfunction metaDataProvider(type, imageId) {\n const { MetadataModules } = Enums;\n\n // Several providers use array queries\n if (Array.isArray(imageId)) {\n return;\n }\n\n const parsedImageId = parseImageId(imageId);\n\n if (type === MetadataModules.MULTIFRAME) {\n const multiframeData = multiframeDataset.retrieveMultiframeDataset(\n parsedImageId.url\n );\n\n if (!multiframeData.dataSet) {\n return;\n }\n\n const multiframeInfo = getDirectFrameInformation(\n multiframeData.dataSet,\n multiframeData.frame\n );\n\n return multiframeInfo;\n }\n\n let url = parsedImageId.url;\n\n if (parsedImageId.frame) {\n url = `${url}&frame=${parsedImageId.frame}`;\n }\n\n const dataSet = dataSetCacheManager.get(url);\n\n if (!dataSet) {\n return;\n }\n\n return metadataForDataset(type, imageId, dataSet);\n}\n\nexport function metadataForDataset(\n type,\n imageId,\n dataSet: dicomParser.DataSet\n) {\n const { MetadataModules } = Enums;\n\n if (type === MetadataModules.GENERAL_STUDY) {\n return {\n studyDescription: dataSet.string('x00081030'),\n studyDate: dicomParser.parseDA(dataSet.string('x00080020')),\n studyTime: dicomParser.parseTM(dataSet.string('x00080030') || ''),\n accessionNumber: dataSet.string('x00080050'),\n };\n }\n\n if (type === MetadataModules.GENERAL_SERIES) {\n return {\n modality: dataSet.string('x00080060'),\n seriesInstanceUID: dataSet.string('x0020000e'),\n seriesNumber: dataSet.intString('x00200011'),\n studyInstanceUID: dataSet.string('x0020000d'),\n seriesDate: dicomParser.parseDA(dataSet.string('x00080021')),\n seriesTime: dicomParser.parseTM(dataSet.string('x00080031') || ''),\n acquisitionDate: dicomParser.parseDA(dataSet.string('x00080022')),\n acquisitionTime: dicomParser.parseTM(dataSet.string('x00080032') || ''),\n };\n }\n\n if (type === MetadataModules.GENERAL_IMAGE) {\n return {\n sopInstanceUID: dataSet.string('x00080018'),\n instanceNumber: dataSet.intString('x00200013'),\n lossyImageCompression: dataSet.string('x00282110'),\n lossyImageCompressionRatio: dataSet.floatString('x00282112'),\n lossyImageCompressionMethod: dataSet.string('x00282114'),\n };\n }\n\n if (type === MetadataModules.PATIENT) {\n return {\n patientID: dataSet.string('x00100020'),\n patientName: dataSet.string('x00100010'),\n };\n }\n\n if (type === MetadataModules.PATIENT_STUDY) {\n return {\n patientAge: dataSet.intString('x00101010'),\n patientSize: dataSet.floatString('x00101020'),\n patientSex: dataSet.string('x00100040'),\n patientWeight: dataSet.floatString('x00101030'),\n };\n }\n\n if (type === MetadataModules.NM_MULTIFRAME_GEOMETRY) {\n const modality = dataSet.string('x00080060');\n const imageSubType = getImageTypeSubItemFromDataset(dataSet, 2);\n\n return {\n modality,\n imageType: dataSet.string('x00080008'),\n imageSubType,\n imageOrientationPatient: extractOrientationFromDataset(dataSet),\n imagePositionPatient: extractPositionFromDataset(dataSet),\n sliceThickness: extractSliceThicknessFromDataset(dataSet),\n pixelSpacing: extractSpacingFromDataset(dataSet),\n numberOfFrames: dataSet.uint16('x00280008'),\n isNMReconstructable:\n isNMReconstructable(imageSubType) && modality.includes('NM'),\n };\n }\n\n if (type === MetadataModules.IMAGE_PLANE) {\n const imageOrientationPatient = extractOrientationFromDataset(dataSet);\n const imagePositionPatient = extractPositionFromDataset(dataSet);\n const pixelSpacing = extractSpacingFromDataset(dataSet);\n const sliceThickness = extractSliceThicknessFromDataset(dataSet);\n\n let columnPixelSpacing = null;\n\n let rowPixelSpacing = null;\n\n if (pixelSpacing) {\n rowPixelSpacing = pixelSpacing[0];\n columnPixelSpacing = pixelSpacing[1];\n }\n\n let rowCosines = null;\n\n let columnCosines = null;\n\n if (imageOrientationPatient) {\n rowCosines = [\n // @ts-expect-error\n parseFloat(imageOrientationPatient[0]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[1]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[2]),\n ];\n columnCosines = [\n // @ts-expect-error\n parseFloat(imageOrientationPatient[3]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[4]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[5]),\n ];\n }\n\n return {\n frameOfReferenceUID: dataSet.string('x00200052'),\n rows: dataSet.uint16('x00280010'),\n columns: dataSet.uint16('x00280011'),\n imageOrientationPatient,\n rowCosines,\n columnCosines,\n imagePositionPatient,\n sliceThickness,\n sliceLocation: dataSet.floatString('x00201041'),\n pixelSpacing,\n rowPixelSpacing,\n columnPixelSpacing,\n };\n }\n\n if (type === MetadataModules.CINE) {\n return {\n frameTime: dataSet.floatString('x00181063'),\n };\n }\n\n if (type === MetadataModules.IMAGE_PIXEL) {\n return getImagePixelModule(dataSet);\n }\n\n if (type === MetadataModules.VOI_LUT) {\n const modalityLUTOutputPixelRepresentation =\n getModalityLUTOutputPixelRepresentation(dataSet);\n\n return {\n windowCenter: getNumberValues(dataSet, 'x00281050', 1),\n windowWidth: getNumberValues(dataSet, 'x00281051', 1),\n voiLUTSequence: getLUTs(\n modalityLUTOutputPixelRepresentation,\n dataSet.elements.x00283010\n ),\n };\n }\n\n if (type === MetadataModules.MODALITY_LUT) {\n return {\n rescaleIntercept: dataSet.floatString('x00281052'),\n rescaleSlope: dataSet.floatString('x00281053'),\n rescaleType: dataSet.string('x00281054'),\n modalityLUTSequence: getLUTs(\n dataSet.uint16('x00280103'),\n dataSet.elements.x00283000\n ),\n };\n }\n\n if (type === MetadataModules.SOP_COMMON) {\n return {\n sopClassUID: dataSet.string('x00080016'),\n sopInstanceUID: dataSet.string('x00080018'),\n };\n }\n\n if (type === MetadataModules.PET_ISOTOPE) {\n const radiopharmaceuticalInfo = dataSet.elements.x00540016;\n\n if (radiopharmaceuticalInfo === undefined) {\n return;\n }\n\n const firstRadiopharmaceuticalInfoDataSet =\n radiopharmaceuticalInfo.items[0].dataSet;\n\n return {\n radiopharmaceuticalInfo: {\n radiopharmaceuticalStartTime: dicomParser.parseTM(\n firstRadiopharmaceuticalInfoDataSet.string('x00181072') || ''\n ),\n radionuclideTotalDose:\n firstRadiopharmaceuticalInfoDataSet.floatString('x00181074'),\n radionuclideHalfLife:\n firstRadiopharmaceuticalInfoDataSet.floatString('x00181075'),\n },\n };\n }\n\n if (type === MetadataModules.OVERLAY_PLANE) {\n return getOverlayPlaneModule(dataSet);\n }\n\n // Note: this is not a DICOM module, but a useful metadata that can be\n // retrieved from the image\n if (type === 'transferSyntax') {\n let transferSyntaxUID;\n\n try {\n transferSyntaxUID = dataSet.string('x00020010');\n } catch (error) {\n // Do nothing\n }\n\n return {\n transferSyntaxUID,\n };\n }\n\n if (type === MetadataModules.PET_SERIES) {\n return {\n correctedImage: dataSet.string('x00280051'),\n units: dataSet.string('x00541001'),\n decayCorrection: dataSet.string('x00541102'),\n };\n }\n\n if (type === MetadataModules.PET_IMAGE) {\n return {\n frameReferenceTime: dataSet.floatString(\n dataSet.string('x00541300') || ''\n ),\n actualFrameDuration: dataSet.intString(dataSet.string('x00181242')),\n };\n }\n\n if (type === MetadataModules.ULTRASOUND_ENHANCED_REGION) {\n return getUSEnhancedRegions(dataSet);\n }\n\n if (type === MetadataModules.CALIBRATION) {\n const modality = dataSet.string('x00080060');\n if (modality === 'US') {\n const enhancedRegion = getUSEnhancedRegions(dataSet);\n return {\n sequenceOfUltrasoundRegions: enhancedRegion,\n };\n }\n }\n\n // Note: this is not a DICOM module, but rather an aggregation on all others\n if (type === 'instance') {\n return getInstanceModule(imageId, metaDataProvider, instanceModuleNames);\n }\n}\n\nexport default metaDataProvider;\n","import type { DataSet } from 'dicom-parser';\n\nexport default function getOverlayPlaneModule(dataSet: DataSet) {\n const overlays = [];\n\n for (let overlayGroup = 0x00; overlayGroup <= 0x1e; overlayGroup += 0x02) {\n let groupStr = `x60${overlayGroup.toString(16)}`;\n\n if (groupStr.length === 4) {\n groupStr = `x600${overlayGroup.toString(16)}`;\n }\n\n const data = dataSet.elements[`${groupStr}3000`];\n\n if (!data) {\n continue;\n }\n\n const pixelData = [];\n\n for (let i = 0; i < data.length; i++) {\n for (let k = 0; k < 8; k++) {\n const byte_as_int = dataSet.byteArray[data.dataOffset + i];\n\n pixelData[i * 8 + k] = (byte_as_int >> k) & 0b1; // eslint-disable-line no-bitwise\n }\n }\n\n overlays.push({\n rows: dataSet.uint16(`${groupStr}0010`),\n columns: dataSet.uint16(`${groupStr}0011`),\n type: dataSet.string(`${groupStr}0040`),\n x: dataSet.int16(`${groupStr}0050`, 1) - 1,\n y: dataSet.int16(`${groupStr}0050`, 0) - 1,\n pixelData,\n description: dataSet.string(`${groupStr}0022`),\n label: dataSet.string(`${groupStr}1500`),\n roiArea: dataSet.string(`${groupStr}1301`),\n roiMean: dataSet.string(`${groupStr}1302`),\n roiStandardDeviation: dataSet.string(`${groupStr}1303`),\n });\n }\n\n return {\n overlays,\n };\n}\n","let files: Blob[] = [];\n\nfunction add(file: Blob): string {\n const fileIndex = files.push(file);\n\n return `dicomfile:${fileIndex - 1}`;\n}\n\nfunction get(index: number): Blob {\n return files[index];\n}\n\nfunction remove(index: number): void {\n files[index] = undefined;\n}\n\nfunction purge(): void {\n files = [];\n}\n\nexport default {\n add,\n get,\n remove,\n purge,\n};\n","import type { ByteArray, DataSet } from 'dicom-parser';\nimport {\n ByteStream,\n createJPEGBasicOffsetTable,\n readEncapsulatedImageFrame,\n readSequenceItem,\n} from 'dicom-parser';\n/**\n * Function to deal with extracting an image frame from an encapsulated data set.\n */\n\nfunction framesAreFragmented(dataSet: DataSet) {\n const numberOfFrames = dataSet.intString('x00280008');\n const pixelDataElement = dataSet.elements.x7fe00010;\n\n return numberOfFrames !== pixelDataElement.fragments.length;\n}\n\nexport default function getEncapsulatedImageFrame(\n dataSet: DataSet,\n frameIndex: number\n): ByteArray {\n if (\n dataSet.elements.x7fe00010 &&\n dataSet.elements.x7fe00010.basicOffsetTable.length\n ) {\n // Basic Offset Table is not empty\n return readEncapsulatedImageFrame(\n dataSet,\n dataSet.elements.x7fe00010,\n frameIndex\n );\n }\n\n // Empty basic offset table\n\n if (framesAreFragmented(dataSet)) {\n const basicOffsetTable = createJPEGBasicOffsetTable(\n dataSet,\n dataSet.elements.x7fe00010\n );\n\n return readEncapsulatedImageFrame(\n dataSet,\n dataSet.elements.x7fe00010,\n frameIndex,\n basicOffsetTable\n );\n }\n\n // the following code is pretty much a duplicate of the logic here\n // https://github.com/cornerstonejs/dicomParser/blob/master/src/readEncapsulatedPixelDataFromFragments.js\n // but it takes care of slicing the array buffer to be sent to the worker. We can't\n // get a view of the buffer because the buffer since it will still have the\n // array buffer, which can be in some cases huge to be sent to the worker.\n // Todo: a better approach would be to transfer the buffer to the worker by having the\n // transferPixelData option set to true, but for some reason it is giving an error\n // in the dicomParser library.\n const fragments = dataSet.elements.x7fe00010.fragments;\n\n // create byte stream on the data for this pixel data element\n const byteStream = new ByteStream(\n dataSet.byteArrayParser,\n dataSet.byteArray,\n dataSet.elements.x7fe00010.dataOffset\n );\n\n // seek past the basic offset table (no need to parse it again since we already have)\n const basicOffsetTable = readSequenceItem(byteStream);\n\n if (basicOffsetTable.tag !== 'xfffee000') {\n throw 'dicomParser.readEncapsulatedPixelData: missing basic offset table xfffee000';\n }\n\n byteStream.seek(basicOffsetTable.length);\n\n const fragmentZeroPosition = byteStream.position;\n\n // we should check that the number of frames + 1 is equal to the number of fragments\n // since there might be a situation where any frame before the one we are looking for\n // here is split into multiple fragments\n if (frameIndex + 1 > fragments.length) {\n throw 'dicomParser.readEncapsulatedPixelData: frame exceeds number of fragments';\n }\n\n const fragmentHeaderSize = 8;\n const byteOffset =\n fragmentZeroPosition + fragments[frameIndex].offset + fragmentHeaderSize;\n const length = fragments[frameIndex].length;\n\n // Grab ONLY the portion of the byteArray containing the frame for decoding since\n // it will be impossible to decode the entire image everytime (this return will go\n // to the decodeImageFrame function in cornerstoneWADOImageLoader which runs in a\n // web worker)\n return new Uint8Array(\n byteStream.byteArray.buffer.slice(\n byteStream.byteArray.byteOffset + byteOffset,\n byteStream.byteArray.byteOffset + byteOffset + length\n )\n );\n}\n","/* eslint no-bitwise: 0 */\n\nimport type { ByteArray } from 'dicom-parser';\n\nfunction isBitSet(byte: number, bitPos: number) {\n return byte & (1 << bitPos);\n}\n\n/**\n * Function to deal with unpacking a binary frame\n */\nfunction unpackBinaryFrame(\n byteArray: ByteArray,\n frameOffset: number,\n pixelsPerFrame: number\n): Uint8Array {\n // Create a new pixel array given the image size\n const pixelData = new Uint8Array(pixelsPerFrame);\n\n for (let i = 0; i < pixelsPerFrame; i++) {\n // Compute byte position\n const bytePos = Math.floor(i / 8);\n\n // Get the current byte\n const byte = byteArray[bytePos + frameOffset];\n\n // Bit position (0-7) within byte\n const bitPos = i % 8;\n\n // Check whether bit at bitpos is set\n pixelData[i] = isBitSet(byte, bitPos) ? 1 : 0;\n }\n\n return pixelData;\n}\n\nexport default unpackBinaryFrame;\n","import type { DataSet } from 'dicom-parser';\nimport unpackBinaryFrame from './unpackBinaryFrame';\n\n/**\n * Function to deal with extracting an image frame from an encapsulated data set.\n */\n\nfunction getUncompressedImageFrame(\n dataSet: DataSet,\n frameIndex: number\n): Uint8Array {\n const pixelDataElement =\n dataSet.elements.x7fe00010 || dataSet.elements.x7fe00008;\n const bitsAllocated = dataSet.uint16('x00280100');\n const rows = dataSet.uint16('x00280010');\n const columns = dataSet.uint16('x00280011');\n\n let samplesPerPixel = dataSet.uint16('x00280002');\n\n /**\n * From: http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.3.html\n *\n * Though the chrominance channels are downsampled, there are still nominally\n * three channels, hence Samples per Pixel (0028,0002) has a value of 3, not\n * 2. I.e., for pixel data in a Native (uncompressed) format, the Value Length\n * of Pixel Data (7FE0,0010) is not:\n *\n * Rows (0028,0010) * Columns (0028,0011) * Number of Frames (0028,0008) *\n * Samples per Pixel (0028,0002) * (⌊(Bits Allocated (0028,0100)-1)/8⌋+1)\n *\n * padded to an even length, as it would otherwise be, but rather is:\n *\n * Rows (0028,0010) * Columns (0028,0011) * Number of Frames (0028,0008) * 2 *\n * (⌊(Bits Allocated (0028,0100)-1)/8⌋+1)\n *\n * padded to an even length.\n */\n const photometricInterpretation = dataSet.string('x00280004');\n\n if (photometricInterpretation === 'YBR_FULL_422') {\n samplesPerPixel = 2;\n console.warn(\n `Using SamplesPerPixel of 2 for YBR_FULL_422 photometric interpretation.\n See http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.3.html for more information.`\n );\n }\n\n const pixelDataOffset = pixelDataElement.dataOffset;\n const pixelsPerFrame = rows * columns * samplesPerPixel;\n\n let frameOffset;\n\n if (bitsAllocated === 8) {\n frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame;\n if (frameOffset >= dataSet.byteArray.length) {\n throw new Error('frame exceeds size of pixelData');\n }\n\n return new Uint8Array(\n dataSet.byteArray.buffer.slice(frameOffset, frameOffset + pixelsPerFrame)\n );\n } else if (bitsAllocated === 16) {\n frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame * 2;\n if (frameOffset >= dataSet.byteArray.length) {\n throw new Error('frame exceeds size of pixelData');\n }\n\n return new Uint8Array(\n dataSet.byteArray.buffer.slice(\n frameOffset,\n frameOffset + pixelsPerFrame * 2\n )\n );\n } else if (bitsAllocated === 1) {\n frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame * 0.125;\n if (frameOffset >= dataSet.byteArray.length) {\n throw new Error('frame exceeds size of pixelData');\n }\n\n return unpackBinaryFrame(dataSet.byteArray, frameOffset, pixelsPerFrame);\n } else if (bitsAllocated === 32) {\n frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame * 4;\n if (frameOffset >= dataSet.byteArray.length) {\n throw new Error('frame exceeds size of pixelData');\n }\n\n return new Uint8Array(\n dataSet.byteArray.buffer.slice(\n frameOffset,\n frameOffset + pixelsPerFrame * 4\n )\n );\n }\n\n throw new Error('unsupported pixel format');\n}\n\nexport default getUncompressedImageFrame;\n","import parseImageId from './parseImageId';\nimport fileManager from './fileManager';\n\nfunction loadFileRequest(uri: string): Promise<ArrayBuffer> {\n const parsedImageId = parseImageId(uri);\n const fileIndex = parseInt(parsedImageId.url, 10);\n const file = fileManager.get(fileIndex);\n\n return new Promise<ArrayBuffer>((resolve, reject) => {\n const fileReader = new FileReader();\n\n fileReader.onload = (e) => {\n const dicomPart10AsArrayBuffer = e.target.result as ArrayBuffer;\n\n resolve(dicomPart10AsArrayBuffer);\n };\n\n fileReader.onerror = reject;\n\n fileReader.readAsArrayBuffer(file);\n });\n}\n\nexport default loadFileRequest;\n","import type { ByteArray, DataSet } from 'dicom-parser';\nimport getEncapsulatedImageFrame from './getEncapsulatedImageFrame';\nimport getUncompressedImageFrame from './getUncompressedImageFrame';\n\nfunction getPixelData(dataSet: DataSet, frameIndex = 0): ByteArray {\n const pixelDataElement =\n dataSet.elements.x7fe00010 || dataSet.elements.x7fe00008;\n\n if (!pixelDataElement) {\n return null;\n }\n\n if (pixelDataElement.encapsulatedPixelData) {\n return getEncapsulatedImageFrame(dataSet, frameIndex);\n }\n\n return getUncompressedImageFrame(dataSet, frameIndex);\n}\n\nexport default getPixelData;\n","import type { Types } from '@cornerstonejs/core';\n\n/**\n * Calculate the minimum and maximum values in an Array\n *\n * @param {Number[]} storedPixelData\n * @return {{min: Number, max: Number}}\n */\nfunction getMinMax(storedPixelData: Types.PixelDataTypedArray): {\n min: number;\n max: number;\n} {\n // we always calculate the min max values since they are not always\n // present in DICOM and we don't want to trust them anyway as cornerstone\n // depends on us providing reliable values for these\n let min = storedPixelData[0];\n\n let max = storedPixelData[0];\n\n let storedPixel;\n const numPixels = storedPixelData.length;\n\n for (let index = 1; index < numPixels; index++) {\n storedPixel = storedPixelData[index];\n min = Math.min(min, storedPixel);\n max = Math.max(max, storedPixel);\n }\n\n return {\n min,\n max,\n };\n}\n\nexport default getMinMax;\n","import {\n convertRGBColorByPixel,\n convertRGBColorByPlane,\n convertYBRFullByPixel,\n convertYBRFull422ByPixel,\n convertYBRFullByPlane,\n convertPALETTECOLOR,\n} from './colorSpaceConverters/index';\n\nfunction convertRGB(imageFrame, colorBuffer, useRGBA) {\n if (imageFrame.planarConfiguration === 0) {\n convertRGBColorByPixel(imageFrame.pixelData, colorBuffer, useRGBA);\n } else {\n convertRGBColorByPlane(imageFrame.pixelData, colorBuffer, useRGBA);\n }\n}\n\nfunction convertYBRFull(imageFrame, colorBuffer, useRGBA) {\n if (imageFrame.planarConfiguration === 0) {\n convertYBRFullByPixel(imageFrame.pixelData, colorBuffer, useRGBA);\n } else {\n convertYBRFullByPlane(imageFrame.pixelData, colorBuffer, useRGBA);\n }\n}\n\nexport default function convertColorSpace(imageFrame, colorBuffer, useRGBA) {\n // convert based on the photometric interpretation\n if (imageFrame.photometricInterpretation === 'RGB') {\n convertRGB(imageFrame, colorBuffer, useRGBA);\n } else if (imageFrame.photometricInterpretation === 'YBR_RCT') {\n convertRGB(imageFrame, colorBuffer, useRGBA);\n } else if (imageFrame.photometricInterpretation === 'YBR_ICT') {\n convertRGB(imageFrame, colorBuffer, useRGBA);\n } else if (imageFrame.photometricInterpretation === 'PALETTE COLOR') {\n convertPALETTECOLOR(imageFrame, colorBuffer, useRGBA);\n } else if (imageFrame.photometricInterpretation === 'YBR_FULL_422') {\n convertYBRFull422ByPixel(imageFrame.pixelData, colorBuffer, useRGBA);\n } else if (imageFrame.photometricInterpretation === 'YBR_FULL') {\n convertYBRFull(imageFrame, colorBuffer, useRGBA);\n } else {\n // TODO - handle YBR_PARTIAL and 420 colour spaces\n throw new Error(\n `No color space conversion for photometric interpretation ${imageFrame.photometricInterpretation}`\n );\n }\n}\n","import type { ByteArray } from 'dicom-parser';\n\nexport default function (\n imageFrame: ByteArray,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n if (imageFrame === undefined) {\n throw new Error('convertYBRFull422ByPixel: ybrBuffer must be defined');\n }\n if (imageFrame.length % 2 !== 0) {\n throw new Error(\n `convertYBRFull422ByPixel: ybrBuffer length ${imageFrame.length} must be divisible by 2`\n );\n }\n\n const numPixels = imageFrame.length / 2;\n\n let ybrIndex = 0;\n\n let bufferIndex = 0;\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; i += 2) {\n const y1 = imageFrame[ybrIndex++];\n const y2 = imageFrame[ybrIndex++];\n const cb = imageFrame[ybrIndex++];\n const cr = imageFrame[ybrIndex++];\n\n colorBuffer[bufferIndex++] = y1 + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y1 - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y1 + 1.772 * (cb - 128); // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n\n colorBuffer[bufferIndex++] = y2 + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y2 - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y2 + 1.772 * (cb - 128); // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n }\n\n return;\n }\n\n for (let i = 0; i < numPixels; i += 2) {\n const y1 = imageFrame[ybrIndex++];\n const y2 = imageFrame[ybrIndex++];\n const cb = imageFrame[ybrIndex++];\n const cr = imageFrame[ybrIndex++];\n\n colorBuffer[bufferIndex++] = y1 + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y1 - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y1 + 1.772 * (cb - 128); // blue\n\n colorBuffer[bufferIndex++] = y2 + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y2 - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y2 + 1.772 * (cb - 128); // blue\n }\n}\n","import type { ByteArray } from 'dicom-parser';\nimport getMinMax from '../shared/getMinMax';\nimport type { Types } from '@cornerstonejs/core';\n\n/**\n * Special decoder for 8 bit jpeg that leverages the browser's built in JPEG decoder for increased performance\n */\n\nfunction arrayBufferToString(buffer: ArrayBuffer) {\n return binaryToString(\n String.fromCharCode.apply(\n null,\n Array.prototype.slice.apply(new Uint8Array(buffer))\n )\n );\n}\n\nfunction binaryToString(binary: string) {\n let error;\n\n try {\n return decodeURIComponent(escape(binary));\n } catch (_error) {\n error = _error;\n if (error instanceof URIError) {\n return binary;\n }\n throw error;\n }\n}\n\nfunction decodeJPEGBaseline8BitColor(\n imageFrame: Types.IImageFrame,\n pixelData: ByteArray,\n canvas: HTMLCanvasElement\n): Promise<Types.IImageFrame> {\n const start = new Date().getTime();\n const imgBlob = new Blob([pixelData], { type: 'image/jpeg' });\n\n return new Promise((resolve, reject) => {\n const fileReader = new FileReader();\n\n if (fileReader.readAsBinaryString === undefined) {\n fileReader.readAsArrayBuffer(imgBlob);\n } else {\n fileReader.readAsBinaryString(imgBlob); // doesn't work on IE11\n }\n\n fileReader.onload = function () {\n const img = new Image();\n\n img.onload = function () {\n canvas.height = img.height;\n canvas.width = img.width;\n imageFrame.rows = img.height;\n imageFrame.columns = img.width;\n const context = canvas.getContext('2d');\n\n /**\n * @todo check this context\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n context.drawImage(this as any, 0, 0);\n const imageData = context.getImageData(0, 0, img.width, img.height);\n const end = new Date().getTime();\n\n imageFrame.pixelData = new Uint8Array(imageData.data.buffer);\n imageFrame.imageData = imageData;\n imageFrame.decodeTimeInMS = end - start;\n\n // calculate smallest and largest PixelValue\n const minMax = getMinMax(imageFrame.pixelData);\n\n imageFrame.smallestPixelValue = minMax.min;\n imageFrame.largestPixelValue = minMax.max;\n imageFrame.pixelDataLength = imageFrame.pixelData.length;\n\n resolve(imageFrame);\n };\n\n img.onerror = function (error) {\n reject(error);\n };\n\n if (fileReader.readAsBinaryString === undefined) {\n img.src = `data:image/jpeg;base64,${window.btoa(\n arrayBufferToString(fileReader.result as ArrayBuffer)\n )}`;\n } else {\n img.src = `data:image/jpeg;base64,${window.btoa(\n fileReader.result as string\n )}`; // doesn't work on IE11\n }\n };\n\n fileReader.onerror = (e) => {\n reject(e);\n };\n });\n}\n\nexport default decodeJPEGBaseline8BitColor;\n","import decodeJPEGBaseline8BitColor from './decodeJPEGBaseline8BitColor';\n\n// dicomParser requires pako for browser-side decoding of deflate transfer syntax\n// We only need one function though, so lets import that so we don't make our bundle\n// too large.\nimport type { ByteArray } from 'dicom-parser';\nimport type { Types } from '@cornerstonejs/core';\nimport { getWebWorkerManager } from '@cornerstonejs/core';\nimport type { LoaderDecodeOptions } from '../types';\n\nfunction processDecodeTask(\n imageFrame: Types.IImageFrame,\n transferSyntax: string,\n pixelData: ByteArray,\n srcOptions,\n decodeConfig: LoaderDecodeOptions\n): Promise<Types.IImageFrame> {\n const options = { ...srcOptions };\n // If a loader is specified, it can't be passed through because it is a function\n // and can't be safely cloned/copied externally.\n delete options.loader;\n // Similarly, the streamData may contain larger data information and\n // although it can be passed to the decoder, it isn't needed and is slow\n delete options.streamingData;\n\n const webWorkerManager = getWebWorkerManager();\n const priority = options.priority || undefined;\n const transferList = options.transferPixelData\n ? [pixelData.buffer]\n : undefined;\n\n return webWorkerManager.executeTask(\n 'dicomImageLoader',\n 'decodeTask',\n {\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig,\n },\n {\n priority,\n requestType: options?.requestType,\n }\n );\n}\n\nfunction decodeImageFrame(\n imageFrame,\n transferSyntax,\n pixelData,\n canvas,\n options = {},\n decodeConfig\n) {\n switch (transferSyntax) {\n case '1.2.840.10008.1.2':\n // Implicit VR Little Endian\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.1':\n // Explicit VR Little Endian\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.2':\n // Explicit VR Big Endian (retired)\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.1.99':\n // Deflate transfer syntax (deflated by dicomParser)\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.5':\n // RLE Lossless\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.50':\n // JPEG Baseline lossy process 1 (8 bit)\n\n // Handle 8-bit JPEG Baseline color images using the browser's built-in\n // JPEG decoding\n if (\n imageFrame.bitsAllocated === 8 &&\n (imageFrame.samplesPerPixel === 3 || imageFrame.samplesPerPixel === 4)\n ) {\n return decodeJPEGBaseline8BitColor(imageFrame, pixelData, canvas);\n }\n\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.51':\n // JPEG Baseline lossy process 2 & 4 (12 bit)\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.57':\n // JPEG Lossless, Nonhierarchical (Processes 14)\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.70':\n // JPEG Lossless, Nonhierarchical (Processes 14 [Selection 1])\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.80':\n // JPEG-LS Lossless Image Compression\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.81':\n // JPEG-LS Lossy (Near-Lossless) Image Compression\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.90':\n // JPEG 2000 Lossless\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.91':\n // JPEG 2000 Lossy\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n\n case '3.2.840.10008.1.2.4.96':\n case '1.2.840.10008.1.2.4.201':\n case '1.2.840.10008.1.2.4.202':\n case '1.2.840.10008.1.2.4.203':\n // HTJ2K\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n }\n\n /* Don't know if these work...\n // JPEG 2000 Part 2 Multicomponent Image Compression (Lossless Only)\n else if(transferSyntax === \"1.2.840.10008.1.2.4.92\")\n {\n return cornerstoneDICOMImageLoader.decodeJPEG2000(dataSet, frame);\n }\n // JPEG 2000 Part 2 Multicomponent Image Compression\n else if(transferSyntax === \"1.2.840.10008.1.2.4.93\")\n {\n return cornerstoneDICOMImageLoader.decodeJPEG2000(dataSet, frame);\n }\n */\n\n return Promise.reject(\n new Error(`No decoder for transfer syntax ${transferSyntax}`)\n );\n}\n\nexport default decodeImageFrame;\n","import type { Types } from '@cornerstonejs/core';\nimport { metaData } from '@cornerstonejs/core';\n\n//\nfunction getImageFrame(imageId: string): Types.IImageFrame {\n const imagePixelModule: Types.ImagePixelModuleMetadata = metaData.get(\n 'imagePixelModule',\n imageId\n );\n\n return {\n samplesPerPixel: imagePixelModule.samplesPerPixel,\n photometricInterpretation: imagePixelModule.photometricInterpretation,\n planarConfiguration: imagePixelModule.planarConfiguration,\n rows: imagePixelModule.rows,\n columns: imagePixelModule.columns,\n bitsAllocated: imagePixelModule.bitsAllocated,\n bitsStored: imagePixelModule.bitsStored,\n pixelRepresentation: imagePixelModule.pixelRepresentation, // 0 = unsigned,\n smallestPixelValue: imagePixelModule.smallestPixelValue,\n largestPixelValue: imagePixelModule.largestPixelValue,\n redPaletteColorLookupTableDescriptor:\n imagePixelModule.redPaletteColorLookupTableDescriptor,\n greenPaletteColorLookupTableDescriptor:\n imagePixelModule.greenPaletteColorLookupTableDescriptor,\n bluePaletteColorLookupTableDescriptor:\n imagePixelModule.bluePaletteColorLookupTableDescriptor,\n redPaletteColorLookupTableData:\n imagePixelModule.redPaletteColorLookupTableData,\n greenPaletteColorLookupTableData:\n imagePixelModule.greenPaletteColorLookupTableData,\n bluePaletteColorLookupTableData:\n imagePixelModule.bluePaletteColorLookupTableData,\n pixelData: undefined, // populated later after decoding\n imageId,\n };\n}\n\nexport default getImageFrame;\n","export default function (photoMetricInterpretation: string): boolean {\n return (\n photoMetricInterpretation === 'RGB' ||\n photoMetricInterpretation === 'PALETTE COLOR' ||\n photoMetricInterpretation === 'YBR_FULL' ||\n photoMetricInterpretation === 'YBR_FULL_422' ||\n photoMetricInterpretation === 'YBR_PARTIAL_422' ||\n photoMetricInterpretation === 'YBR_PARTIAL_420' ||\n photoMetricInterpretation === 'YBR_RCT' ||\n photoMetricInterpretation === 'YBR_ICT'\n );\n}\n","import type { ByteArray } from 'dicom-parser';\nimport getMinMax from '../shared/getMinMax';\nimport getPixelDataTypeFromMinMax from '../shared/getPixelDataTypeFromMinMax';\nimport type { DICOMLoaderImageOptions, DICOMLoaderIImage } from '../types';\nimport type { Types } from '@cornerstonejs/core';\nimport {\n canRenderFloatTextures,\n Enums,\n metaData,\n utilities,\n} from '@cornerstonejs/core';\nimport convertColorSpace from './convertColorSpace';\nimport isColorConversionRequired from './isColorConversionRequired';\nimport decodeImageFrame from './decodeImageFrame';\nimport getImageFrame from './getImageFrame';\nimport getScalingParameters from './getScalingParameters';\nimport { getOptions } from './internal/options';\nimport isColorImageFn from '../shared/isColorImage';\n\nlet lastImageIdDrawn = '';\n\nfunction isModalityLUTForDisplay(sopClassUid: string): boolean {\n // special case for XA and XRF\n // https://groups.google.com/forum/#!searchin/comp.protocols.dicom/Modality$20LUT$20XA/comp.protocols.dicom/UBxhOZ2anJ0/D0R_QP8V2wIJ\n return (\n sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.1' && // XA\n sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.2.1'\n ); // XRF\n}\n\n/**\n * Helper function to set the right typed array.\n * This is needed because web workers can transfer array buffers but not typed arrays\n *\n * Here we are setting the pixel data to the right typed array based on the final\n * min and max values\n */\nfunction setPixelDataType(imageFrame) {\n const minValue = imageFrame.smallestPixelValue;\n const maxValue = imageFrame.largestPixelValue;\n\n const TypedArray = getPixelDataTypeFromMinMax(minValue, maxValue);\n\n if (TypedArray) {\n // @ts-ignore\n const typedArray = new TypedArray(imageFrame.pixelData);\n imageFrame.pixelData = typedArray;\n } else {\n throw new Error('Could not apply a typed array to the pixel data');\n }\n}\n\n/**\n * Removes the A from RGBA to return RGB buffer, this is used when the\n * decoding happens with browser API which results in RGBA, but if useRGBA flag\n * is set to false, we want to return RGB\n *\n * @param pixelData - decoded image in RGBA\n * @param targetBuffer - target buffer to write to\n */\nfunction removeAFromRGBA(\n pixelData: Types.PixelDataTypedArray,\n targetBuffer: Uint8ClampedArray | Uint8Array\n) {\n const numPixels = pixelData.length / 4;\n\n let rgbIndex = 0;\n\n let bufferIndex = 0;\n\n for (let i = 0; i < numPixels; i++) {\n targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // red\n targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // green\n targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // blue\n rgbIndex++; // skip alpha\n }\n\n return targetBuffer;\n}\n\nfunction createImage(\n imageId: string,\n pixelData: ByteArray,\n transferSyntax: string,\n options: DICOMLoaderImageOptions = {}\n): Promise<DICOMLoaderIImage | Types.IImageFrame> {\n // whether to use RGBA for color images, default true as cs-legacy uses RGBA\n // but we don't need RGBA in cs3d, and it's faster, and memory-efficient\n // in cs3d\n const useRGBA = options.useRGBA;\n\n // always preScale the pixel array unless it is asked not to\n options.preScale = {\n enabled:\n options.preScale && options.preScale.enabled !== undefined\n ? options.preScale.enabled\n : true,\n };\n\n if (!pixelData?.length) {\n return Promise.reject(new Error('The pixel data is missing'));\n }\n\n const { MetadataModules } = Enums;\n const canvas = document.createElement('canvas');\n const imageFrame = getImageFrame(imageId);\n imageFrame.decodeLevel = options.decodeLevel;\n\n options.allowFloatRendering = canRenderFloatTextures();\n\n // Get the scaling parameters from the metadata\n if (options.preScale.enabled) {\n const scalingParameters = getScalingParameters(metaData, imageId);\n\n if (scalingParameters) {\n options.preScale = {\n ...options.preScale,\n scalingParameters: scalingParameters as Types.ScalingParameters,\n };\n }\n }\n\n const { decodeConfig } = getOptions();\n\n // Remove any property of the `imageFrame` that cannot be transferred to the worker,\n // such as promises and functions.\n // This is necessary because the `imageFrame` object is passed to the worker.\n Object.keys(imageFrame).forEach((key) => {\n if (\n typeof imageFrame[key] === 'function' ||\n imageFrame[key] instanceof Promise\n ) {\n delete imageFrame[key];\n }\n });\n\n const decodePromise = decodeImageFrame(\n imageFrame,\n transferSyntax,\n pixelData,\n canvas,\n options,\n decodeConfig\n );\n\n const isColorImage = isColorImageFn(imageFrame.photometricInterpretation);\n\n return new Promise<DICOMLoaderIImage | Types.IImageFrame>(\n (resolve, reject) => {\n // eslint-disable-next-line complexity\n decodePromise.then(function (imageFrame: Types.IImageFrame) {\n // If we have a target buffer that was written to in the\n // Decode task, point the image to it here.\n let alreadyTyped = false;\n // We can safely render color image in 8 bit, so no need to convert\n if (\n options.targetBuffer &&\n options.targetBuffer.type &&\n !isColorImage\n ) {\n const {\n arrayBuffer,\n type,\n offset: rawOffset = 0,\n length: rawLength,\n } = options.targetBuffer;\n\n const imageFrameLength = imageFrame.pixelDataLength;\n\n const offset = rawOffset;\n const length =\n rawLength !== null && rawLength !== undefined\n ? rawLength\n : imageFrameLength - offset;\n\n const typedArrayConstructors = {\n Uint8Array,\n Uint16Array,\n Int16Array,\n Float32Array,\n };\n\n if (length !== imageFrame.pixelDataLength) {\n throw new Error(\n `target array for image does not have the same length (${length}) as the decoded image length (${imageFrame.pixelDataLength}).`\n );\n }\n\n const TypedArrayConstructor = typedArrayConstructors[type];\n\n // TypedArray.Set is api level and ~50x faster than copying elements even for\n // Arrays of different types, which aren't simply memcpy ops.\n const typedArray = arrayBuffer\n ? new TypedArrayConstructor(arrayBuffer, offset, length)\n : new TypedArrayConstructor(imageFrame.pixelData);\n\n if (length !== imageFrame.pixelDataLength) {\n throw new Error(\n 'target array for image does not have the same length as the decoded image length.'\n );\n }\n\n imageFrame.pixelData = typedArray;\n alreadyTyped = true;\n }\n\n if (!alreadyTyped) {\n setPixelDataType(imageFrame);\n }\n\n const imagePlaneModule: Types.ImagePlaneModuleMetadata =\n metaData.get(MetadataModules.IMAGE_PLANE, imageId) || {};\n const voiLutModule =\n metaData.get(MetadataModules.VOI_LUT, imageId) || {};\n const modalityLutModule =\n metaData.get(MetadataModules.MODALITY_LUT, imageId) || {};\n const sopCommonModule: Types.SopCommonModuleMetadata =\n metaData.get(MetadataModules.SOP_COMMON, imageId) || {};\n const calibrationModule =\n metaData.get(MetadataModules.CALIBRATION, imageId) || {};\n const { rows, columns } = imageFrame;\n\n if (isColorImage) {\n if (isColorConversionRequired(imageFrame)) {\n canvas.height = imageFrame.rows;\n canvas.width = imageFrame.columns;\n const context = canvas.getContext('2d');\n let imageData = context.createImageData(\n imageFrame.columns,\n imageFrame.rows\n );\n if (!useRGBA) {\n // Use a hard coded 3 samples per pixel for the destination, as the\n // original samples per pixel may not be 3 for palette color\n imageData = {\n ...imageData,\n data: new Uint8ClampedArray(\n 3 * imageFrame.columns * imageFrame.rows\n ),\n };\n }\n convertColorSpace(imageFrame, imageData.data, useRGBA);\n imageFrame.imageData = imageData;\n imageFrame.pixelData = imageData.data;\n imageFrame.pixelDataLength = imageData.data.length;\n } else if (\n !useRGBA &&\n imageFrame.pixelDataLength === 4 * rows * columns\n ) {\n // This case is the case where we need RGB (that is !useRGBA), and\n // we have RGBA (that is 4 values per pixel, not 3). For this case,\n // remove the A value.\n // Note: rendering libraries like vtk expect Uint8Array for RGB images\n // otherwise they will convert them to Float32Array which might be slow\n const colorBuffer = new Uint8Array(\n (imageFrame.pixelData.length / 4) * 3\n );\n\n // remove the A from the RGBA of the imageFrame\n imageFrame.pixelData = removeAFromRGBA(\n imageFrame.pixelData,\n colorBuffer\n );\n\n imageFrame.pixelDataLength = imageFrame.pixelData.length;\n }\n // else {\n // No need to do any conversion - already RGB\n // Consider RGB to RGBA conversion?\n\n /** @todo check as any */\n // calculate smallest and largest PixelValue of the converted pixelData\n const minMax = getMinMax(imageFrame.pixelData);\n\n imageFrame.smallestPixelValue = minMax.min;\n imageFrame.largestPixelValue = minMax.max;\n }\n\n const voxelManager = utilities.VoxelManager.createImageVoxelManager({\n scalarData: imageFrame.pixelData,\n width: imageFrame.columns,\n height: imageFrame.rows,\n numberOfComponents: imageFrame.samplesPerPixel,\n });\n\n const image: DICOMLoaderIImage = {\n imageId,\n dataType: imageFrame.pixelData.constructor\n .name as Types.PixelDataTypedArrayString,\n color: isColorImage,\n calibration: calibrationModule,\n columnPixelSpacing: imagePlaneModule.columnPixelSpacing,\n columns: imageFrame.columns,\n height: imageFrame.rows,\n preScale: imageFrame.preScale,\n intercept: modalityLutModule.rescaleIntercept\n ? modalityLutModule.rescaleIntercept\n : 0,\n slope: modalityLutModule.rescaleSlope\n ? modalityLutModule.rescaleSlope\n : 1,\n invert: imageFrame.photometricInterpretation === 'MONOCHROME1',\n minPixelValue: imageFrame.smallestPixelValue,\n maxPixelValue: imageFrame.largestPixelValue,\n rowPixelSpacing: imagePlaneModule.rowPixelSpacing,\n rows: imageFrame.rows,\n sizeInBytes: imageFrame.pixelData.byteLength,\n width: imageFrame.columns,\n // use the first value for rendering, if other values\n // are needed later, it can be grabbed again from the voiLUtModule\n windowCenter: voiLutModule.windowCenter\n ? voiLutModule.windowCenter[0]\n : undefined,\n windowWidth: voiLutModule.windowWidth\n ? voiLutModule.windowWidth[0]\n : undefined,\n voiLUTFunction: voiLutModule.voiLUTFunction\n ? voiLutModule.voiLUTFunction\n : undefined,\n decodeTimeInMS: imageFrame.decodeTimeInMS,\n floatPixelData: undefined,\n imageFrame,\n voxelManager,\n rgba: isColorImage && useRGBA,\n getPixelData: () => imageFrame.pixelData,\n getCanvas: undefined,\n numberOfComponents: imageFrame.samplesPerPixel,\n };\n\n if (image.color) {\n image.getCanvas = function () {\n // the getCanvas function is used in the CPU rendering path\n // and it is used to use the canvas api to draw the image\n // instead of looping through the pixel data and drawing each pixel\n // to use the canvas api, we need to convert the pixel data to a\n // Uint8ClampedArray (which is what the canvas api expects)\n // and then we can use the putImageData api to draw the image\n // However, if the image already was loaded without the alpha channel\n // we need to add the alpha channel back in\n if (lastImageIdDrawn === imageId) {\n return canvas;\n }\n\n const width = image.columns;\n const height = image.rows;\n\n canvas.height = height;\n canvas.width = width;\n const ctx = canvas.getContext('2d');\n const imageData = ctx.createImageData(width, height);\n\n const arr = imageFrame.pixelData;\n\n if (arr.length === width * height * 4) {\n for (let i = 0; i < arr.length; i++) {\n imageData.data[i] = arr[i];\n }\n }\n // Set pixel data for RGB array\n else if (arr.length === width * height * 3) {\n let j = 0;\n for (let i = 0; i < arr.length; i += 3) {\n imageData.data[j++] = arr[i];\n imageData.data[j++] = arr[i + 1];\n imageData.data[j++] = arr[i + 2];\n imageData.data[j++] = 255;\n }\n }\n\n imageFrame.pixelData = imageData.data;\n imageFrame.pixelDataLength = imageData.data.length;\n\n imageFrame.imageData = imageData;\n ctx.putImageData(imageFrame.imageData, 0, 0);\n lastImageIdDrawn = imageId;\n\n return canvas;\n };\n }\n\n // Modality LUT\n if (\n modalityLutModule.modalityLUTSequence &&\n modalityLutModule.modalityLUTSequence.length > 0 &&\n isModalityLUTForDisplay(sopCommonModule.sopClassUID)\n ) {\n image.modalityLUT = modalityLutModule.modalityLUTSequence[0];\n }\n\n // VOI LUT\n if (\n voiLutModule.voiLUTSequence &&\n voiLutModule.voiLUTSequence.length > 0\n ) {\n image.voiLUT = voiLutModule.voiLUTSequence[0];\n }\n\n if (image.color) {\n // Note that by the DICOM definition, the window width and center are\n // 256/128 for an identity transform.\n image.windowWidth = 256;\n image.windowCenter = 128;\n }\n\n // set the ww/wc to cover the dynamic range of the image if no values are supplied\n if (\n image.windowCenter === undefined ||\n image.windowWidth === undefined\n ) {\n const minVoi = image.imageFrame.smallestPixelValue;\n const maxVoi = image.imageFrame.largestPixelValue;\n\n image.windowWidth = maxVoi - minVoi;\n image.windowCenter = (maxVoi + minVoi) / 2;\n }\n resolve(image);\n }, reject);\n }\n );\n}\n\nexport default createImage;\n","import type { Types } from '@cornerstonejs/core';\n\nexport default function getPixelDataTypeFromMinMax(\n min: number,\n max: number\n): Types.PixelDataTypedArray {\n let pixelDataType;\n if (Number.isInteger(min) && Number.isInteger(max)) {\n if (min >= 0) {\n if (max <= 255) {\n pixelDataType = Uint8Array;\n } else if (max <= 65535) {\n pixelDataType = Uint16Array;\n }\n } else {\n if (min >= -128 && max <= 127) {\n pixelDataType = Int8Array;\n } else if (min >= -32768 && max <= 32767) {\n pixelDataType = Int16Array;\n }\n }\n }\n\n return pixelDataType || Float32Array;\n}\n","import type { Types } from '@cornerstonejs/core';\n\n/**\n * It returns the scaling parameters for the image with the given imageId. This can be\n * used to get passed (as an option) to the imageLoader in order to apply scaling to the image inside\n * the imageLoader.\n * @param imageId - The imageId of the image\n * @returns ScalingParameters\n */\nexport default function getScalingParameters(metaData, imageId: string) {\n const modalityLutModule = metaData.get('modalityLutModule', imageId) || {};\n\n const generalSeriesModule = (metaData.get('generalSeriesModule', imageId) ||\n {}) as Types.GeneralSeriesModuleMetadata;\n\n const { modality } = generalSeriesModule;\n\n const scalingParameters = {\n rescaleSlope: modalityLutModule.rescaleSlope,\n rescaleIntercept: modalityLutModule.rescaleIntercept,\n modality,\n };\n\n const suvFactor = metaData.get('scalingModule', imageId) || {};\n\n return {\n ...scalingParameters,\n ...(modality === 'PT' && { suvbw: suvFactor.suvbw }),\n };\n}\n","/**\n * This function checks color space conversion data requirements before\n * applying them. This function was created to solve problems like the one\n * discussed in here https://discourse.orthanc-server.org/t/orthanc-convert-ybr-to-rgb-but-does-not-change-metadata/3533/17\n * In this case, Orthanc server converts the pixel data from YBR to RGB, but maintain\n * the photometricInterpretation dicom tag in YBR\n * @param imageFrame\n * @param RGBA\n * @returns\n */\nexport default function isColorConversionRequired(imageFrame) {\n if (imageFrame === undefined) {\n return false;\n }\n const {\n rows,\n columns,\n photometricInterpretation,\n pixelDataLength,\n planarConfiguration,\n } = imageFrame;\n\n // if it is rgba don't convert (typically jpeg, jpeg-xl, jpeg2000 etc)\n if (pixelDataLength === 4 * columns * rows) {\n // RGBA - JPEG\n return false;\n }\n\n if (photometricInterpretation.endsWith('420')) {\n return (\n pixelDataLength ===\n (3 * Math.ceil(columns / 2) + Math.floor(columns / 2)) * rows\n );\n } else if (photometricInterpretation.endsWith('422')) {\n return (\n pixelDataLength ===\n (3 * Math.ceil(columns / 2) + Math.floor(columns / 2)) *\n Math.ceil(rows / 2) +\n Math.floor(rows / 2) * columns\n );\n } else {\n return photometricInterpretation !== 'RGB' || planarConfiguration === 1;\n // and it is one of the rle and lei cases then we need to convert\n }\n}\n","import type { DataSet } from 'dicom-parser';\nimport type { Types } from '@cornerstonejs/core';\nimport createImage from '../createImage';\nimport { xhrRequest } from '../internal/index';\nimport dataSetCacheManager from './dataSetCacheManager';\nimport type {\n LoadRequestFunction,\n DICOMLoaderIImage,\n DICOMLoaderImageOptions,\n} from '../../types';\nimport getPixelData from './getPixelData';\nimport loadFileRequest from './loadFileRequest';\nimport parseImageId from './parseImageId';\n\n// add a decache callback function to clear out our dataSetCacheManager\nfunction addDecache(imageLoadObject: Types.IImageLoadObject, imageId: string) {\n imageLoadObject.decache = function () {\n // console.log('decache');\n const parsedImageId = parseImageId(imageId);\n\n dataSetCacheManager.unload(parsedImageId.url);\n };\n}\n\n/**\n * Given the dataSetPromise and imageId this will return a promise to be\n * resolved with an image object containing the loaded image.\n *\n * @param dataSetPromise - A promise that resolves to a DataSet object.\n * @param imageId - The imageId of the image to be loaded.\n * @param frame - The frame number to be loaded in case of multiframe. it should\n * be noted that this is used to extract the pixelData from dicomParser and\n * dicomParser is 0-based index (the first pixelData is frame 0); however,\n * in metadata and imageId frame is 1-based index (the first frame is frame 1).\n * @param sharedCacheKey - A key to be used to cache the loaded image.\n * @param options - Options to be used when loading the image.\n * @param callbacks - Callbacks to be called when the image is loaded.\n * @returns An object containing a promise to be resolved with the loaded image\n */\nfunction loadImageFromPromise(\n dataSetPromise: Promise<DataSet>,\n imageId: string,\n frame = 0,\n sharedCacheKey: string,\n options: DICOMLoaderImageOptions,\n callbacks?: {\n imageDoneCallback: (image: DICOMLoaderIImage) => void;\n }\n): Types.IImageLoadObject {\n const start = new Date().getTime();\n const imageLoadObject: Types.IImageLoadObject = {\n cancelFn: undefined,\n promise: undefined,\n };\n\n imageLoadObject.promise = new Promise((resolve, reject) => {\n dataSetPromise.then(\n (dataSet /* , xhr*/) => {\n const pixelData = getPixelData(dataSet, frame);\n const transferSyntax = dataSet.string('x00020010');\n const loadEnd = new Date().getTime();\n const imagePromise = createImage(\n imageId,\n pixelData,\n transferSyntax,\n options\n );\n\n addDecache(imageLoadObject, imageId);\n\n imagePromise.then(\n (image) => {\n image = image as DICOMLoaderIImage;\n image.data = dataSet;\n image.sharedCacheKey = sharedCacheKey;\n const end = new Date().getTime();\n\n image.loadTimeInMS = loadEnd - start;\n image.totalTimeInMS = end - start;\n if (\n callbacks !== undefined &&\n callbacks.imageDoneCallback !== undefined\n ) {\n callbacks.imageDoneCallback(image);\n }\n resolve(image);\n },\n function (error) {\n // Reject the error, and the dataSet\n reject({\n error,\n dataSet,\n });\n }\n );\n },\n function (error) {\n // Reject the error\n reject({\n error,\n });\n }\n );\n });\n\n return imageLoadObject;\n}\n\nfunction loadImageFromDataSet(\n dataSet,\n imageId: string,\n frame = 0,\n sharedCacheKey: string,\n options\n): Types.IImageLoadObject {\n const start = new Date().getTime();\n\n const promise = new Promise<DICOMLoaderIImage | Types.IImageFrame>(\n (resolve, reject) => {\n const loadEnd = new Date().getTime();\n\n let imagePromise: Promise<DICOMLoaderIImage | Types.IImageFrame>;\n\n try {\n const pixelData = getPixelData(dataSet, frame);\n const transferSyntax = dataSet.string('x00020010');\n\n imagePromise = createImage(imageId, pixelData, transferSyntax, options);\n } catch (error) {\n // Reject the error, and the dataSet\n reject({\n error,\n dataSet,\n });\n\n return;\n }\n\n imagePromise.then((image) => {\n image = image as DICOMLoaderIImage;\n\n image.data = dataSet;\n image.sharedCacheKey = sharedCacheKey;\n const end = new Date().getTime();\n\n image.loadTimeInMS = loadEnd - start;\n image.totalTimeInMS = end - start;\n resolve(image);\n }, reject);\n }\n );\n\n return {\n promise: promise as Promise<Types.IImage>,\n cancelFn: undefined,\n };\n}\n\nfunction getLoaderForScheme(scheme: string): LoadRequestFunction {\n if (scheme === 'dicomweb' || scheme === 'wadouri') {\n return xhrRequest as LoadRequestFunction;\n } else if (scheme === 'dicomfile') {\n return loadFileRequest as LoadRequestFunction;\n }\n}\n\nfunction loadImage(\n imageId: string,\n options: DICOMLoaderImageOptions = {}\n): Types.IImageLoadObject {\n const parsedImageId = parseImageId(imageId);\n\n options = Object.assign({}, options);\n\n // IMPORTANT: if you have a custom loader that you want to use for a specific\n // scheme, you should create your own loader and register it with the scheme\n // in the image loader, and NOT just pass it in as an option. This is because\n // the scheme is used to determine the loader to use and is more maintainable\n\n // The loader isn't transferable, so ensure it is deleted\n delete options.loader;\n // The options might have a loader above, but it is a loader into the cache,\n // so not the scheme loader, which is separate and defined by the scheme here\n const schemeLoader = getLoaderForScheme(parsedImageId.scheme);\n\n // if the dataset for this url is already loaded, use it, in case of multiframe\n // images, we need to extract the frame pixelData from the dataset although the\n // image is loaded\n if (dataSetCacheManager.isLoaded(parsedImageId.url)) {\n /**\n * @todo The arguments to the dataSetCacheManager below are incorrect.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dataSet: DataSet = (dataSetCacheManager as any).get(\n parsedImageId.url,\n schemeLoader,\n imageId\n );\n\n return loadImageFromDataSet(\n dataSet,\n imageId,\n parsedImageId.pixelDataFrame,\n parsedImageId.url,\n options\n );\n }\n\n // load the dataSet via the dataSetCacheManager\n const dataSetPromise = dataSetCacheManager.load(\n parsedImageId.url,\n schemeLoader,\n imageId\n );\n\n return loadImageFromPromise(\n dataSetPromise,\n imageId,\n parsedImageId.frame,\n parsedImageId.url,\n options\n );\n}\n\nexport { loadImageFromPromise, getLoaderForScheme, loadImage };\n","import { metaData, registerImageLoader, type Types } from '@cornerstonejs/core';\nimport { loadImage } from './loadImage';\nimport { metaDataProvider } from './metaData/index';\n\nexport default function (): void {\n // register dicomweb and wadouri image loader prefixes\n registerImageLoader('dicomweb', loadImage as unknown as Types.ImageLoaderFn);\n registerImageLoader('wadouri', loadImage as unknown as Types.ImageLoaderFn);\n registerImageLoader('dicomfile', loadImage as unknown as Types.ImageLoaderFn);\n\n // add wadouri metadata provider\n metaData.addProvider(metaDataProvider);\n}\n","import {\n getImagePixelModule,\n getLUTs,\n getModalityLUTOutputPixelRepresentation,\n getNumberValues,\n metaDataProvider,\n metadataForDataset,\n} from './metaData/index';\n\nimport dataSetCacheManager from './dataSetCacheManager';\nimport fileManager from './fileManager';\nimport getEncapsulatedImageFrame from './getEncapsulatedImageFrame';\nimport getUncompressedImageFrame from './getUncompressedImageFrame';\nimport loadFileRequest from './loadFileRequest';\nimport getPixelData from './getPixelData';\nimport {\n loadImageFromPromise,\n getLoaderForScheme,\n loadImage,\n} from './loadImage';\nimport parseImageId from './parseImageId';\nimport unpackBinaryFrame from './unpackBinaryFrame';\nimport register from './register';\n\nconst metaData = {\n getImagePixelModule,\n getLUTs,\n getModalityLUTOutputPixelRepresentation,\n getNumberValues,\n metaDataProvider,\n metadataForDataset,\n};\n\nexport default {\n metaData,\n dataSetCacheManager,\n fileManager,\n getEncapsulatedImageFrame,\n getUncompressedImageFrame,\n loadFileRequest,\n loadImageFromPromise,\n getLoaderForScheme,\n getPixelData,\n loadImage,\n parseImageId,\n unpackBinaryFrame,\n register,\n};\n","import type { WADORSMetaDataElement } from '../../../types';\n\n/**\n * Returns the raw value\n *\n * @param element - The javascript object for the specified element in the metadata\n * @param [index] - the index of the value in a multi-valued element, default is 0\n * @param [defaultValue] - The default value to return if the element does not exist\n * @returns {*}\n */\nfunction getValue<ReturnType = unknown>(\n element: WADORSMetaDataElement,\n index?: number,\n defaultValue?: ReturnType\n): ReturnType {\n index = index || 0;\n if (!element) {\n return defaultValue;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return defaultValue;\n }\n // make sure we have the specified index\n if (Array.isArray(element.Value) && element.Value.length <= index) {\n return defaultValue;\n }\n\n return element.Value[index] as ReturnType;\n}\n\nexport default getValue;\n","import type { WADORSMetaDataElement } from '../../../types';\nimport getValue from './getValue';\n\n/**\n * Returns the first string value as a Javascript number\n *\n * @param element - The javascript object for the specified element in the metadata\n * @param [index] - the index of the value in a multi-valued element, default is 0\n * @param [defaultValue] - The default value to return if the element does not exist\n * @returns {*}\n */\nfunction getNumberString(\n element: WADORSMetaDataElement,\n index: number,\n defaultValue: number\n): number {\n const value = getValue<string | number>(element, index, defaultValue);\n\n if (value === undefined) {\n return;\n }\n\n return parseFloat(String(value));\n}\n\nexport default getNumberString;\n","import type { WADORSMetaDataElement } from '../../../types';\nimport getValue from './getValue';\n\nfunction getNumberValue(\n element: WADORSMetaDataElement,\n index?: number\n): number {\n const value = getValue(element, index) as string;\n\n if (value === undefined) {\n return;\n }\n\n return parseFloat(value);\n}\n\nexport default getNumberValue;\n","import type { WADORSMetaDataElement } from '../../../types';\n\n/**\n * Returns the values as an array of javascript numbers\n *\n * @param element - The javascript object for the specified element in the metadata\n * @param [minimumLength] - the minimum number of values\n * @returns {*}\n */\nfunction getNumberValues(\n element: WADORSMetaDataElement,\n minimumLength?: number\n): number[] {\n if (!element) {\n return;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return;\n }\n // Make sure the Value is an array\n if (!Array.isArray(element.Value)) {\n return;\n }\n // make sure we have the expected length\n if (minimumLength && element.Value.length < minimumLength) {\n return;\n }\n\n const values: number[] = [];\n\n for (let i = 0; i < element.Value.length; i++) {\n // @ts-expect-error\n values.push(parseFloat(element.Value[i]));\n }\n\n return values;\n}\n\nexport default getNumberValues;\n","/**\n * Removes the data loader scheme from the imageId\n *\n * @param {string} imageId Image ID\n * @returns {string} imageId without the data loader scheme\n * @memberof Cache\n */\nexport default function imageIdToURI(imageId: string): string {\n const colonIndex = imageId.indexOf(':');\n\n return imageId.substring(colonIndex + 1);\n}\n","export default function getTagValue(tag, justElement = true) {\n if (tag && tag.Value) {\n if (tag.Value[0] && justElement) {\n return tag.Value[0];\n }\n\n return tag.Value;\n }\n\n return tag;\n}\n","import getTagValue from './getTagValue';\n\nfunction getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frameNumber\n) {\n const shared = (\n SharedFunctionalGroupsSequence\n ? Object.values(SharedFunctionalGroupsSequence[0])\n : []\n )\n .map((it) => it[0])\n .filter((it) => it !== undefined && typeof it === 'object');\n const perFrame = (\n PerFrameFunctionalGroupsSequence\n ? Object.values(PerFrameFunctionalGroupsSequence[frameNumber - 1])\n : []\n )\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((it: any) => it.Value[0])\n .filter((it) => it !== undefined && typeof it === 'object');\n\n return {\n shared,\n perFrame,\n };\n}\n\nfunction getMultiframeInformation(metaData) {\n let {\n 52009230: PerFrameFunctionalGroupsSequence,\n 52009229: SharedFunctionalGroupsSequence,\n '00280008': NumberOfFrames,\n // eslint-disable-next-line prefer-const\n ...rest\n } = metaData;\n\n PerFrameFunctionalGroupsSequence = getTagValue(\n PerFrameFunctionalGroupsSequence,\n false\n );\n SharedFunctionalGroupsSequence = getTagValue(\n SharedFunctionalGroupsSequence,\n false\n );\n NumberOfFrames = getTagValue(NumberOfFrames);\n\n return {\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n NumberOfFrames,\n rest,\n };\n}\n// function that retrieves specific frame metadata information from multiframe\n// metadata\nfunction combineFrameInstance(frameNumber, instance) {\n const {\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n NumberOfFrames,\n rest,\n } = getMultiframeInformation(instance);\n\n if (PerFrameFunctionalGroupsSequence || NumberOfFrames > 1) {\n const { shared, perFrame } = getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frameNumber\n );\n\n const newInstance = Object.assign(instance, { frameNumber });\n\n // merge the shared first then the per frame to override\n [...shared, ...perFrame].forEach((item) => {\n Object.entries(item).forEach(([key, value]) => {\n newInstance[key] = value;\n });\n });\n\n return Object.assign(rest, { '00280008': NumberOfFrames }, newInstance);\n }\n\n return instance;\n}\n\nexport { combineFrameInstance, getMultiframeInformation, getFrameInformation };\n","import type { WADORSMetaData } from '../../types';\nimport imageIdToURI from '../imageIdToURI';\nimport { combineFrameInstance } from './combineFrameInstance';\n\nlet metadataByImageURI = [];\nlet multiframeMetadataByImageURI = {};\n\nimport getValue from './metaData/getValue';\n\n// get metadata information for the first frame\nfunction _retrieveMultiframeMetadataImageURI(imageURI) {\n const lastSlashIdx = imageURI.indexOf('/frames/') + 8;\n // imageid string without frame number\n const imageIdFrameless = imageURI.slice(0, lastSlashIdx);\n // calculating frame number\n const frame = parseInt(imageURI.slice(lastSlashIdx), 10);\n // retrieving the frame 1 that contains multiframe information\n\n const metadata = metadataByImageURI[`${imageIdFrameless}1`];\n\n return {\n metadata,\n frame,\n };\n}\n\nfunction retrieveMultiframeMetadataImageId(imageId) {\n const imageURI = imageIdToURI(imageId);\n\n return _retrieveMultiframeMetadataImageURI(imageURI);\n}\n\nfunction isMultiframe(metadata) {\n // Checks if dicomTag NumberOf Frames exists and it is greater than one\n const numberOfFrames = getValue<number>(metadata['00280008']);\n\n return numberOfFrames && numberOfFrames > 1;\n}\n\nfunction add(imageId: string, metadata: WADORSMetaData) {\n const imageURI = imageIdToURI(imageId);\n\n Object.defineProperty(metadata, 'isMultiframe', {\n value: isMultiframe(metadata),\n enumerable: false,\n });\n\n metadataByImageURI[imageURI] = metadata;\n}\n\n// multiframes images will have only one imageId returned by the dicomweb\n// client and registered in metadataByImageURI for all the n frames. If an\n// imageId does not have metadata, or it does not have at all, or the imageID\n// belongs to a frame, not registered in metadataByImageURI\nfunction get(imageId: string): WADORSMetaData {\n const imageURI = imageIdToURI(imageId);\n\n // Check if the metadata is already available\n const metadata = metadataByImageURI[imageURI];\n\n if (metadata && !metadata?.isMultiframe) {\n // Return the metadata for single-frame images\n return metadata;\n }\n\n const cachedMetadata = multiframeMetadataByImageURI[imageURI];\n\n if (cachedMetadata) {\n return cachedMetadata;\n }\n\n // Try to get the metadata for a specific frame of a multiframe image\n const retrievedMetadata = _retrieveMultiframeMetadataImageURI(imageURI);\n\n if (!retrievedMetadata || !retrievedMetadata.metadata) {\n return;\n }\n\n const { metadata: firstFrameMetadata, frame } = retrievedMetadata;\n\n if (firstFrameMetadata) {\n // Combine the metadata from the first frame with the metadata from the specified frame\n const combined = combineFrameInstance(frame, firstFrameMetadata);\n\n multiframeMetadataByImageURI[imageURI] = combined;\n\n return combined;\n }\n}\n\nfunction remove(imageId) {\n const imageURI = imageIdToURI(imageId);\n\n metadataByImageURI[imageURI] = undefined;\n\n multiframeMetadataByImageURI[imageURI] = undefined;\n}\n\nfunction purge() {\n metadataByImageURI = [];\n multiframeMetadataByImageURI = {};\n}\n\nexport { metadataByImageURI, isMultiframe, retrieveMultiframeMetadataImageId };\n\nexport default {\n add,\n get,\n remove,\n purge,\n};\n","import getTagValue from '../getTagValue';\nimport getValue from './getValue';\nimport isNMReconstructable from '../../isNMReconstructable';\nimport getNumberValues from './getNumberValues';\n\n/**\n * Checks if the modality is Nuclear Medicine (NM)\n * @param metaData The metadata object containing DICOM tags\n * @returns True if the modality includes 'NM', false otherwise\n */\nfunction isNMModality(metaData) {\n const modality = getValue(metaData['00080060']) as string;\n\n return modality.includes('NM');\n}\n\n/**\n * Get a subpart of Image Type dicom tag defined by index\n * @param {*} metaData\n * @param {*} index 0 based index of the subtype\n */\nfunction getImageTypeSubItemFromMetadata(metaData, index) {\n const imageType = getTagValue(metaData['00080008'], false);\n\n if (imageType) {\n // const subTypes = imageType.split('\\\\');\n\n // if (subTypes.length > index) {\n // return subTypes[index];\n // }\n return imageType[index];\n }\n\n return undefined;\n}\n/**\n * Extracts the orientation from NM multiframe metadata, if image type\n * equal to RECON TOMO or RECON GATED TOMO\n * @param {*} metaData\n * @returns\n */\nfunction extractOrientationFromNMMultiframeMetadata(metaData) {\n let imageOrientationPatient;\n const imageSubType = getImageTypeSubItemFromMetadata(metaData, 2);\n\n if (imageSubType && isNMReconstructable(imageSubType)) {\n const detectorInformationSequence = getTagValue(metaData['00540022']);\n\n if (detectorInformationSequence) {\n imageOrientationPatient = getNumberValues(\n detectorInformationSequence['00200037'],\n 6\n );\n }\n }\n\n return imageOrientationPatient;\n}\n\n/**\n * Extracts the position from NM multiframe dataset, if image type\n * equal to RECON TOMO or RECON GATED TOMO\n * @param {*} metaData\n * @returns\n */\nfunction extractPositionFromNMMultiframeMetadata(metaData) {\n let imagePositionPatient;\n const imageSubType = getImageTypeSubItemFromMetadata(metaData, 2);\n\n if (imageSubType && isNMReconstructable(imageSubType)) {\n const detectorInformationSequence = getTagValue(metaData['00540022']);\n\n if (detectorInformationSequence) {\n imagePositionPatient = getNumberValues(\n detectorInformationSequence['00200032'],\n 3\n );\n }\n }\n\n return imagePositionPatient;\n}\n\nexport {\n extractOrientationFromNMMultiframeMetadata,\n extractPositionFromNMMultiframeMetadata,\n isNMModality,\n getImageTypeSubItemFromMetadata,\n};\n","import getNumberValues from './getNumberValues';\nimport {\n extractOrientationFromNMMultiframeMetadata,\n extractPositionFromNMMultiframeMetadata,\n isNMModality,\n} from './NMHelpers';\n\n/**\n * Extract orientation information from a metadata. It tries to get the orientation\n * from the Detector Information Sequence (for NM images) if image type equal\n * to RECON TOMO or RECON GATED TOMO\n * @param {*} metaData\n * @returns\n */\nfunction extractOrientationFromMetadata(metaData) {\n let imageOrientationPatient = getNumberValues(metaData['00200037'], 6);\n\n // If orientation not valid to this point, trying to get the orientation\n // from the Detector Information Sequence (for NM images) with image type\n // equal to RECON TOMO or RECON GATED TOMO\n\n if (!imageOrientationPatient && isNMModality(metaData)) {\n imageOrientationPatient =\n extractOrientationFromNMMultiframeMetadata(metaData);\n }\n\n return imageOrientationPatient;\n}\n\n/**\n * Extract position information from a metaData. It tries to get the position\n * from the Detector Information Sequence (for NM images) if image type equal\n * to RECON TOMO or RECON GATED TOMO\n * @param {*} metaData\n * @returns\n */\nfunction extractPositionFromMetadata(metaData) {\n let imagePositionPatient = getNumberValues(metaData['00200032'], 3);\n\n // If position not valid to this point, trying to get the position\n // from the Detector Information Sequence (for NM images)\n if (!imagePositionPatient && isNMModality(metaData)) {\n imagePositionPatient = extractPositionFromNMMultiframeMetadata(metaData);\n }\n\n return imagePositionPatient;\n}\n\nexport { extractOrientationFromMetadata, extractPositionFromMetadata };\n","import getNumberValues from './getNumberValues';\n\n/**\n * This helper function retrieves the first number value from the provided sequence for the given key.\n * @param sequence - The sequence from which to retrieve the number value.\n * @param key - The key for which to retrieve the number value.\n * @returns The first number value for the given key, or null if no value is found.\n */\nfunction getFirstNumberValue(sequence: unknown, key: string): number | null {\n const values = getNumberValues(sequence[key]);\n return values ? values[0] : null;\n}\n\nexport { getFirstNumberValue };\n","import type { WADORSMetaDataElement } from '../../../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSequenceItems(element: any): WADORSMetaDataElement[] {\n // Value is not present if the attribute has a zero length value\n if (!element?.Value?.length) {\n return [];\n }\n\n if (!Array.isArray(element.Value)) {\n // If the Value is an object, encapsulate it in an array and log a warning message\n if (typeof element.Value === 'object') {\n console.warn(\n 'Warning: Value should be an array, but an object was found. Encapsulating the object in an array.'\n );\n return [element.Value];\n }\n return [];\n }\n return element.Value;\n}\n\nexport default getSequenceItems;\n","import { getFirstNumberValue } from './getFirstNumberValue';\nimport getSequenceItems from './getSequenceItems';\n\n/**\n * This function retrieves the ultrasound regions from the provided metadata.\n * @param metadata - The metadata from which to retrieve the ultrasound regions.\n * @returns An array of ultrasound regions, or null if no regions are found.\n */\nfunction getUSEnhancedRegions(metadata) {\n const sequenceOfUltrasoundRegions = getSequenceItems(metadata['00186011']);\n\n if (!sequenceOfUltrasoundRegions || !sequenceOfUltrasoundRegions.length) {\n return null;\n }\n\n const regions = sequenceOfUltrasoundRegions.map((sequence) => {\n const physicalDeltaX = getFirstNumberValue(sequence, '0018602C');\n const physicalDeltaY = getFirstNumberValue(sequence, '0018602E');\n const physicalUnitsXDirection = getFirstNumberValue(sequence, '00186024');\n const physicalUnitsYDirection = getFirstNumberValue(sequence, '00186026');\n\n const regionLocationMinY0 = getFirstNumberValue(sequence, '0018601A');\n const regionLocationMaxY1 = getFirstNumberValue(sequence, '0018601E');\n const regionLocationMinX0 = getFirstNumberValue(sequence, '00186018');\n const regionLocationMaxX1 = getFirstNumberValue(sequence, '0018601C');\n const referencePixelX0 = getFirstNumberValue(sequence, '00186020');\n const referencePixelY0 = getFirstNumberValue(sequence, '00186022');\n\n const referencePhysicalPixelValueY = getFirstNumberValue(\n sequence,\n '0018602A'\n );\n const referencePhysicalPixelValueX = getFirstNumberValue(\n sequence,\n '00186028'\n );\n const regionSpatialFormat = getFirstNumberValue(sequence, '00186012');\n\n const regionDataType = getFirstNumberValue(sequence, '00186014');\n const regionFlags = getFirstNumberValue(sequence, '00186016');\n const transducerFrequency = getFirstNumberValue(sequence, '00186030');\n\n return {\n regionLocationMinY0,\n regionLocationMaxY1,\n regionLocationMinX0,\n regionLocationMaxX1,\n referencePixelX0,\n referencePixelY0,\n physicalDeltaX,\n physicalDeltaY,\n physicalUnitsXDirection,\n physicalUnitsYDirection,\n referencePhysicalPixelValueY,\n referencePhysicalPixelValueX,\n regionSpatialFormat,\n regionDataType,\n regionFlags,\n transducerFrequency,\n };\n });\n\n return regions;\n}\nexport { getUSEnhancedRegions };\n","import * as dicomParser from 'dicom-parser';\nimport { Enums, utilities } from '@cornerstonejs/core';\nimport getNumberValues from './getNumberValues';\nimport getNumberValue from './getNumberValue';\nimport getOverlayPlaneModule from './getOverlayPlaneModule';\nimport metaDataManager, {\n retrieveMultiframeMetadataImageId,\n} from '../metaDataManager';\nimport getValue from './getValue';\nimport {\n getMultiframeInformation,\n getFrameInformation,\n} from '../combineFrameInstance';\nimport {\n extractOrientationFromMetadata,\n extractPositionFromMetadata,\n} from './extractPositioningFromMetadata';\nimport { getImageTypeSubItemFromMetadata } from './NMHelpers';\nimport isNMReconstructable from '../../isNMReconstructable';\nimport {\n getInstanceModule,\n instanceModuleNames,\n} from '../../getInstanceModule';\nimport { getUSEnhancedRegions } from './USHelpers';\n\nfunction metaDataProvider(type, imageId) {\n const { MetadataModules } = Enums;\n\n if (type === MetadataModules.MULTIFRAME) {\n // the get function removes the PerFrameFunctionalGroupsSequence\n const { metadata, frame } = retrieveMultiframeMetadataImageId(imageId);\n\n if (!metadata) {\n return;\n }\n const {\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n NumberOfFrames,\n } = getMultiframeInformation(metadata);\n\n if (PerFrameFunctionalGroupsSequence || NumberOfFrames > 1) {\n const { shared, perFrame } = getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frame\n );\n\n return {\n NumberOfFrames,\n //PerFrameFunctionalGroupsSequence,\n PerFrameFunctionalInformation: perFrame,\n SharedFunctionalInformation: shared,\n };\n }\n\n return {\n NumberOfFrames,\n //PerFrameFunctionalGroupsSequence,\n };\n }\n\n const metaData = metaDataManager.get(imageId);\n\n if (!metaData) {\n return;\n }\n\n if (type === MetadataModules.GENERAL_STUDY) {\n return {\n studyDescription: getValue<string>(metaData['00081030']),\n studyDate: dicomParser.parseDA(getValue<string>(metaData['00080020'])),\n studyTime: dicomParser.parseTM(\n getValue<string>(metaData['00080030'], 0, '')\n ),\n accessionNumber: getValue<string>(metaData['00080050']),\n };\n }\n\n if (type === MetadataModules.GENERAL_SERIES) {\n return {\n modality: getValue<string>(metaData['00080060']),\n seriesInstanceUID: getValue<string>(metaData['0020000E']),\n seriesNumber: getNumberValue(metaData['00200011']),\n studyInstanceUID: getValue<string>(metaData['0020000D']),\n seriesDate: dicomParser.parseDA(getValue<string>(metaData['00080021'])),\n seriesTime: dicomParser.parseTM(\n getValue<string>(metaData['00080031'], 0, '')\n ),\n acquisitionDate: dicomParser.parseDA(\n getValue<string>(metaData['00080022'])\n ),\n acquisitionTime: dicomParser.parseTM(\n getValue<string>(metaData['00080032'], 0, '')\n ),\n };\n }\n\n if (type === MetadataModules.GENERAL_IMAGE) {\n return {\n sopInstanceUID: getValue<string>(metaData['00080018']),\n instanceNumber: getNumberValue(metaData['00200013']),\n lossyImageCompression: getValue<string>(metaData['00282110']),\n lossyImageCompressionRatio: getNumberValue(metaData['00282112']),\n lossyImageCompressionMethod: getValue<string>(metaData['00282114']),\n };\n }\n\n if (type === MetadataModules.PATIENT) {\n return {\n patientID: getValue<string>(metaData['00100020']),\n patientName: getValue<string>(metaData['00100010']),\n };\n }\n\n if (type === MetadataModules.PATIENT_STUDY) {\n return {\n patientAge: getNumberValue(metaData['00101010']),\n patientSize: getNumberValue(metaData['00101020']),\n patientSex: getValue<'M' | 'F'>(metaData['00100040']),\n patientWeight: getNumberValue(metaData['00101030']),\n };\n }\n\n if (type === MetadataModules.NM_MULTIFRAME_GEOMETRY) {\n const modality = getValue(metaData['00080060']) as string;\n const imageSubType = getImageTypeSubItemFromMetadata(metaData, 2);\n\n return {\n modality,\n imageType: getValue(metaData['00080008']),\n imageSubType,\n imageOrientationPatient: extractOrientationFromMetadata(metaData),\n imagePositionPatient: extractPositionFromMetadata(metaData),\n sliceThickness: getNumberValue(metaData['00180050']),\n spacingBetweenSlices: getNumberValue(metaData['00180088']),\n pixelSpacing: getNumberValues(metaData['00280030'], 2),\n numberOfFrames: getNumberValue(metaData['00280008']),\n isNMReconstructable:\n isNMReconstructable(imageSubType) && modality.includes('NM'),\n };\n }\n\n if (type === MetadataModules.IMAGE_PLANE) {\n //metaData = fixNMMetadata(metaData);\n let imageOrientationPatient = extractOrientationFromMetadata(metaData);\n let imagePositionPatient = extractPositionFromMetadata(metaData);\n const pixelSpacing = getNumberValues(metaData['00280030'], 2);\n\n let columnPixelSpacing = null;\n let rowPixelSpacing = null;\n let rowCosines = null;\n let columnCosines = null;\n\n let usingDefaultValues = false;\n if (pixelSpacing) {\n rowPixelSpacing = pixelSpacing[0];\n columnPixelSpacing = pixelSpacing[1];\n } else {\n usingDefaultValues = true;\n rowPixelSpacing = 1;\n columnPixelSpacing = 1;\n }\n\n if (imageOrientationPatient) {\n rowCosines = [\n // @ts-expect-error\n parseFloat(imageOrientationPatient[0]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[1]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[2]),\n ];\n columnCosines = [\n // @ts-expect-error\n parseFloat(imageOrientationPatient[3]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[4]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[5]),\n ];\n } else {\n rowCosines = [0, 1, 0];\n columnCosines = [0, 0, -1];\n usingDefaultValues = true;\n imageOrientationPatient = [...rowCosines, ...columnCosines];\n }\n\n if (!imagePositionPatient) {\n imagePositionPatient = [0, 0, 0];\n usingDefaultValues = true;\n }\n\n return {\n frameOfReferenceUID: getValue<string>(metaData['00200052']),\n rows: getNumberValue(metaData['00280010']),\n columns: getNumberValue(metaData['00280011']),\n imageOrientationPatient,\n rowCosines,\n columnCosines,\n imagePositionPatient,\n sliceThickness: getNumberValue(metaData['00180050']),\n sliceLocation: getNumberValue(metaData['00201041']),\n pixelSpacing,\n rowPixelSpacing,\n columnPixelSpacing,\n usingDefaultValues,\n };\n }\n\n if (type === MetadataModules.ULTRASOUND_ENHANCED_REGION) {\n return getUSEnhancedRegions(metaData);\n }\n\n if (type === MetadataModules.CALIBRATION) {\n const modality = getValue(metaData['00080060']);\n\n if (modality === 'US') {\n const enhancedRegion = getUSEnhancedRegions(metaData);\n return {\n sequenceOfUltrasoundRegions: enhancedRegion,\n };\n }\n }\n\n if (type === MetadataModules.IMAGE_URL) {\n return getImageUrlModule(imageId, metaData);\n }\n\n if (type === MetadataModules.CINE) {\n return getCineModule(imageId, metaData);\n }\n\n if (type === MetadataModules.IMAGE_PIXEL) {\n return {\n samplesPerPixel: getNumberValue(metaData['00280002']),\n photometricInterpretation: getValue(metaData['00280004']),\n rows: getNumberValue(metaData['00280010']),\n columns: getNumberValue(metaData['00280011']),\n bitsAllocated: getNumberValue(metaData['00280100']),\n bitsStored: getNumberValue(metaData['00280101']),\n highBit: getValue(metaData['00280102']),\n pixelRepresentation: getNumberValue(metaData['00280103']),\n planarConfiguration: getNumberValue(metaData['00280006']),\n pixelAspectRatio: getValue(metaData['00280034']),\n smallestPixelValue: getNumberValue(metaData['00280106']),\n largestPixelValue: getNumberValue(metaData['00280107']),\n redPaletteColorLookupTableDescriptor: getNumberValues(\n metaData['00281101']\n ),\n greenPaletteColorLookupTableDescriptor: getNumberValues(\n metaData['00281102']\n ),\n bluePaletteColorLookupTableDescriptor: getNumberValues(\n metaData['00281103']\n ),\n redPaletteColorLookupTableData: getNumberValues(metaData['00281201']),\n greenPaletteColorLookupTableData: getNumberValues(metaData['00281202']),\n bluePaletteColorLookupTableData: getNumberValues(metaData['00281203']),\n };\n }\n\n if (type === MetadataModules.VOI_LUT) {\n return {\n // TODO VOT LUT Sequence\n windowCenter: getNumberValues(metaData['00281050'], 1),\n windowWidth: getNumberValues(metaData['00281051'], 1),\n };\n }\n\n if (type === MetadataModules.MODALITY_LUT) {\n return {\n // TODO VOT LUT Sequence\n rescaleIntercept: getNumberValue(metaData['00281052']),\n rescaleSlope: getNumberValue(metaData['00281053']),\n rescaleType: getValue(metaData['00281054']),\n };\n }\n\n if (type === MetadataModules.SOP_COMMON) {\n return {\n sopClassUID: getValue<string>(metaData['00080016']),\n sopInstanceUID: getValue<string>(metaData['00080018']),\n };\n }\n\n if (type === MetadataModules.PET_ISOTOPE) {\n const radiopharmaceuticalInfo = getValue(metaData['00540016']);\n\n if (radiopharmaceuticalInfo === undefined) {\n return;\n }\n\n return {\n radiopharmaceuticalInfo: {\n radiopharmaceuticalStartTime: dicomParser.parseTM(\n getValue(radiopharmaceuticalInfo['00181072'], 0, '')\n ),\n radiopharmaceuticalStartDateTime: getValue(\n radiopharmaceuticalInfo['00181078'],\n 0,\n ''\n ),\n radionuclideTotalDose: getNumberValue(\n radiopharmaceuticalInfo['00181074']\n ),\n radionuclideHalfLife: getNumberValue(\n radiopharmaceuticalInfo['00181075']\n ),\n },\n };\n }\n\n if (type === MetadataModules.OVERLAY_PLANE) {\n return getOverlayPlaneModule(metaData);\n }\n\n // Note: this is not a DICOM module, but a useful metadata that can be\n // retrieved from the image\n if (type === 'transferSyntax') {\n return getTransferSyntax(imageId, metaData);\n }\n\n if (type === MetadataModules.PET_SERIES) {\n return {\n correctedImage: getValue(metaData['00280051']),\n units: getValue(metaData['00541001']),\n decayCorrection: getValue(metaData['00541102']),\n };\n }\n\n if (type === MetadataModules.PET_IMAGE) {\n return {\n frameReferenceTime: getNumberValue(metaData['00541300']),\n actualFrameDuration: getNumberValue(metaData['00181242']),\n };\n }\n\n // Note: this is not a DICOM module, but rather an aggregation on all others\n if (type === 'instance') {\n return getInstanceModule(imageId, metaDataProvider, instanceModuleNames);\n }\n}\n\nexport function getImageUrlModule(imageId, metaData) {\n const { transferSyntaxUID } = getTransferSyntax(imageId, metaData);\n const isVideo = utilities.isVideoTransferSyntax(transferSyntaxUID);\n const imageUrl = imageId.substring(7);\n const thumbnail = imageUrl.replace('/frames/', '/thumbnail/');\n let rendered = imageUrl.replace('/frames/', '/rendered/');\n if (isVideo) {\n rendered = rendered.replace('/rendered/1', '/rendered');\n }\n return {\n isVideo,\n rendered,\n thumbnail,\n };\n}\n\nexport function getCineModule(imageId, metaData) {\n const cineRate = getValue<string>(metaData['00180040']);\n return {\n cineRate,\n numberOfFrames: getNumberValue(metaData['00280008']),\n };\n}\n\nexport function getTransferSyntax(imageId, metaData) {\n // Use either the FMI, which is NOT permitted in the DICOMweb data, but\n // is sometimes found there anyways, or the available transfer syntax, which\n // is the recommended way of getting it.\n return {\n transferSyntaxUID:\n getValue<string>(metaData['00020010']) ||\n getValue<string>(metaData['00083002']),\n };\n}\n\nexport default metaDataProvider;\n","import getValue from './getValue';\nimport getNumberValue from './getNumberValue';\nimport type { WADORSMetaData } from '../../../types';\n\nexport default function getOverlayPlaneModule(metaData: WADORSMetaData) {\n const overlays = [];\n\n for (let overlayGroup = 0x00; overlayGroup <= 0x1e; overlayGroup += 0x02) {\n let groupStr = `x60${overlayGroup.toString(16)}`;\n\n if (groupStr.length === 4) {\n groupStr = `x600${overlayGroup.toString(16)}`;\n }\n\n /**\n * @todo there is a type issue with WADORSMetaData. Currently WADORSMetaData\n * on includes string[] | number[] | boolean. from the look of this, data\n * is a more complex type\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = getValue(metaData[`${groupStr}3000`]) as any;\n\n if (!data) {\n continue;\n }\n\n const pixelData = [];\n\n for (let i = 0; i < data.length; i++) {\n for (let k = 0; k < 8; k++) {\n const byte_as_int = metaData.Value[data.dataOffset + i];\n\n pixelData[i * 8 + k] = (byte_as_int >> k) & 0b1; // eslint-disable-line no-bitwise\n }\n }\n\n overlays.push({\n rows: getNumberValue(metaData[`${groupStr}0010`]),\n columns: getNumberValue(metaData[`${groupStr}0011`]),\n type: getValue(metaData[`${groupStr}0040`]),\n x: getNumberValue(metaData[`${groupStr}0050`], 1) - 1,\n y: getNumberValue(metaData[`${groupStr}0050`], 0) - 1,\n pixelData,\n description: getValue(metaData[`${groupStr}0022`]),\n label: getValue(metaData[`${groupStr}1500`]),\n roiArea: getValue(metaData[`${groupStr}1301`]),\n roiMean: getValue(metaData[`${groupStr}1302`]),\n roiStandardDeviation: getValue(metaData[`${groupStr}1303`]),\n });\n }\n\n return {\n overlays,\n };\n}\n","import type { Types, Enums } from '@cornerstonejs/core';\nimport { getOptions } from './options';\nimport type {\n LoaderXhrRequestError,\n LoaderXhrRequestPromise,\n} from '../../types';\nimport metaDataManager from '../wadors/metaDataManager';\nimport extractMultipart from '../wadors/extractMultipart';\nimport { getImageQualityStatus } from '../wadors/getImageQualityStatus';\nimport type { CornerstoneWadoRsLoaderOptions } from '../wadors/loadImage';\n\ntype RangeRetrieveOptions = Types.RangeRetrieveOptions;\n\n/**\n * Performs a range request to fetch part of an encoded image, typically\n * so that partial resolution images can be fetched.\n * The configuration of exactly what is requested is based on the transfer\n * syntax provided.\n * Note this generates 1 response for each call, and those reponses may or may\n * not be combined with each other depending on the configuration applied.\n *\n * * HTJ2K Streaming TSUID -> Use actual range requests, and set it up for streaming\n * image decoding of byte range requests\n * * JLS and Non-streaming HTJ2K -> Use a sub-resolution (or thumbnail) endpoint\n * followed by normal endpoint\n *\n * @param url - including an fsiz parameter\n * @param imageId - to fetch for\n * @param defaultHeaders - to add to the request\n * @returns Compressed image data\n */\nexport default function rangeRequest(\n url: string,\n imageId: string,\n defaultHeaders: Record<string, string> = {},\n options: CornerstoneWadoRsLoaderOptions = {}\n): LoaderXhrRequestPromise<{\n contentType: string;\n pixelData: Uint8Array;\n imageQualityStatus: Enums.ImageQualityStatus;\n percentComplete: number;\n}> {\n const globalOptions = getOptions();\n const { retrieveOptions = {} as RangeRetrieveOptions, streamingData } =\n options;\n const chunkSize =\n streamingData.chunkSize ||\n getValue(imageId, retrieveOptions, 'chunkSize') ||\n 65536;\n\n const errorInterceptor = (err) => {\n if (typeof globalOptions.errorInterceptor === 'function') {\n const error = new Error('request failed') as LoaderXhrRequestError;\n globalOptions.errorInterceptor(error);\n } else {\n console.warn('rangeRequest:Caught', err);\n }\n };\n\n // Make the request for the streamable image frame (i.e. HTJ2K)\n const promise = new Promise<{\n contentType: string;\n pixelData: Uint8Array;\n percentComplete: number;\n imageQualityStatus: Enums.ImageQualityStatus;\n // eslint-disable-next-line no-async-promise-executor\n }>(async (resolve, reject) => {\n const headers = Object.assign(\n {},\n defaultHeaders\n /* beforeSendHeaders */\n );\n\n Object.keys(headers).forEach(function (key) {\n if (headers[key] === null || headers[key] === undefined) {\n delete headers[key];\n }\n });\n\n try {\n if (!streamingData.encodedData) {\n streamingData.chunkSize = chunkSize;\n streamingData.rangesFetched = 0;\n }\n const byteRange = getByteRange(streamingData, retrieveOptions);\n\n const { encodedData, responseHeaders } = await fetchRangeAndAppend(\n url,\n headers,\n byteRange,\n streamingData\n );\n\n // Resolve promise with the first range, so it can be passed through to\n // cornerstone via the usual image loading pathway. All subsequent\n // ranges will be passed and decoded via events.\n const contentType = responseHeaders.get('content-type');\n const { totalBytes } = streamingData;\n const doneAllBytes = totalBytes === encodedData.byteLength;\n const extract = extractMultipart(contentType, encodedData, {\n isPartial: true,\n });\n\n // Allow over-writing the done status to indicate complete on partial\n const imageQualityStatus = getImageQualityStatus(\n retrieveOptions,\n doneAllBytes || extract.extractDone\n );\n resolve({\n ...extract,\n imageQualityStatus,\n percentComplete: extract.extractDone\n ? 100\n : (chunkSize * 100) / totalBytes,\n });\n } catch (err) {\n errorInterceptor(err);\n console.error(err);\n reject(err);\n }\n });\n\n return promise;\n}\n\nasync function fetchRangeAndAppend(\n url: string,\n headers: Record<string, string>,\n range: [number, number | ''],\n streamingData\n) {\n if (range) {\n headers = Object.assign(headers, {\n Range: `bytes=${range[0]}-${range[1]}`,\n });\n }\n let { encodedData } = streamingData;\n if (range[1] && encodedData?.byteLength > range[1]) {\n return streamingData;\n }\n const response = await fetch(url, {\n headers,\n signal: undefined,\n });\n\n const responseArrayBuffer = await response.arrayBuffer();\n const responseTypedArray = new Uint8Array(responseArrayBuffer);\n const { status } = response;\n\n // Append new data\n let newByteArray: Uint8Array;\n if (encodedData) {\n newByteArray = new Uint8Array(\n encodedData.length + responseTypedArray.length\n );\n newByteArray.set(encodedData, 0);\n newByteArray.set(responseTypedArray, encodedData.length);\n streamingData.rangesFetched = 1;\n } else {\n newByteArray = new Uint8Array(responseTypedArray.length);\n newByteArray.set(responseTypedArray, 0);\n streamingData.rangesFetched++;\n }\n streamingData.encodedData = encodedData = newByteArray;\n streamingData.responseHeaders = response.headers;\n\n const contentRange = response.headers.get('Content-Range');\n if (contentRange) {\n streamingData.totalBytes = Number(contentRange.split('/')[1]);\n } else if (status !== 206 || !range) {\n streamingData.totalBytes = encodedData?.byteLength;\n } else if (range[1] === '' || encodedData?.length < range[1]) {\n streamingData.totalBytes = encodedData.byteLength;\n } else {\n streamingData.totalBytes = Number.MAX_SAFE_INTEGER;\n }\n\n return streamingData;\n}\n\nfunction getValue(imageId: string, src, attr: string) {\n const value = src[attr];\n if (typeof value !== 'function') {\n return value;\n }\n const metaData = metaDataManager.get(imageId);\n return value(metaData, imageId);\n}\n\nfunction getByteRange(\n streamingData,\n retrieveOptions: RangeRetrieveOptions\n): [number, number | ''] {\n const { totalBytes, encodedData, chunkSize = 65536 } = streamingData;\n const { rangeIndex = 0 } = retrieveOptions;\n if (rangeIndex === -1 && (!totalBytes || !encodedData)) {\n return [0, ''];\n }\n if (rangeIndex === -1 || encodedData?.byteLength > totalBytes - chunkSize) {\n return [encodedData?.byteLength || 0, ''];\n }\n // Note the byte range is inclusive at both ends and zero based,\n // so the byteLength is the next index to fetch.\n return [encodedData?.byteLength || 0, chunkSize * (rangeIndex + 1) - 1];\n}\n","import type { Types } from '@cornerstonejs/core';\nimport { xhrRequest } from '../internal/index';\n// import rangeRequest from '../internal/rangeRequest';\nimport streamRequest from '../internal/streamRequest';\nimport rangeRequest from '../internal/rangeRequest';\nimport extractMultipart from './extractMultipart';\nimport { getImageQualityStatus } from './getImageQualityStatus';\nimport type { CornerstoneWadoRsLoaderOptions } from './loadImage';\n\nfunction getPixelData(\n uri: string,\n imageId: string,\n mediaType = 'application/octet-stream',\n options?: CornerstoneWadoRsLoaderOptions\n) {\n const { streamingData, retrieveOptions = {} as Types.RetrieveOptions } =\n options || {};\n const headers = {\n Accept: mediaType,\n };\n\n // Add urlArguments to the url for retrieving - allows accept and other\n // parameters to be added.\n let url = retrieveOptions.urlArguments\n ? `${uri}${uri.indexOf('?') === -1 ? '?' : '&'}${\n retrieveOptions.urlArguments\n }`\n : uri;\n\n // Replace the /frames/ part of the path with another path to choose\n // a different resource type.\n if (retrieveOptions.framesPath) {\n url = url.replace('/frames/', retrieveOptions.framesPath);\n }\n\n // Swap the streaming data out if a new instance starts.\n if (streamingData?.url !== url) {\n options.streamingData = { url };\n }\n\n if (\n (retrieveOptions as Types.RangeRetrieveOptions).rangeIndex !== undefined\n ) {\n return rangeRequest(url, imageId, headers, options);\n }\n\n // Use the streaming parser only when configured to do so\n if ((retrieveOptions as Types.StreamingRetrieveOptions).streaming) {\n return streamRequest(url, imageId, headers, options);\n }\n\n /**\n * Not progressively rendering, use regular xhr request.\n */\n const loadPromise = xhrRequest(url, imageId, headers);\n const { xhr } = loadPromise;\n\n return loadPromise.then(function (imageFrameAsArrayBuffer /* , xhr*/) {\n const contentType =\n xhr.getResponseHeader('Content-Type') || 'application/octet-stream';\n const extracted = extractMultipart(\n contentType,\n new Uint8Array(imageFrameAsArrayBuffer)\n );\n extracted.imageQualityStatus = getImageQualityStatus(retrieveOptions, true);\n return extracted;\n });\n}\n\nexport default getPixelData;\n","import {\n Enums,\n imageRetrievalPoolManager,\n utilities,\n} from '@cornerstonejs/core';\nimport { Enums as csCoreEnums, type Types } from '@cornerstonejs/core';\n\nimport createImage from '../createImage';\nimport getPixelData from './getPixelData';\nimport type { DICOMLoaderIImage, DICOMLoaderImageOptions } from '../../types';\n\nconst { ProgressiveIterator } = utilities;\nconst { ImageQualityStatus } = Enums;\nconst streamableTransferSyntaxes = new Set<string>([\n // Private HTJ2K\n '3.2.840.10008.1.2.4.96',\n // Released HTJ2K - only the RPCL one is definitely streamable.\n '1.2.840.10008.1.2.4.202',\n // HTJ2K lossy might be streamable, so try it. If it fails it is ok as it will\n // proceed and eventually work.\n '1.2.840.10008.1.2.4.203',\n]);\n\n/**\n * Helper method to extract the transfer-syntax from the response of the server.\n * @param {string} contentType The value of the content-type header as returned by the WADO-RS server.\n * @return The transfer-syntax as announced by the server, or Implicit Little Endian by default.\n */\nexport function getTransferSyntaxForContentType(contentType: string): string {\n const defaultTransferSyntax = '1.2.840.10008.1.2'; // Default is Implicit Little Endian.\n if (!contentType) {\n return defaultTransferSyntax;\n }\n\n // Browse through the content type parameters\n const parameters = contentType.split(';');\n const params: Record<string, string> = {};\n\n parameters.forEach((parameter) => {\n // Look for a transfer-syntax=XXXX pair\n const parameterValues = parameter.split('=');\n\n if (parameterValues.length !== 2) {\n return;\n }\n\n const value = parameterValues[1].trim().replace(/\"/g, '');\n\n params[parameterValues[0].trim()] = value;\n });\n\n // This is useful if the PACS doesn't respond with a syntax\n // in the content type.\n // http://dicom.nema.org/medical/dicom/current/output/chtml/part18/chapter_6.html#table_6.1.1.8-3b\n const defaultTransferSyntaxByType = {\n 'image/jpeg': '1.2.840.10008.1.2.4.50',\n 'image/x-dicom-rle': '1.2.840.10008.1.2.5',\n 'image/x-jls': '1.2.840.10008.1.2.4.80',\n 'image/jls': '1.2.840.10008.1.2.4.80',\n 'image/jll': '1.2.840.10008.1.2.4.70',\n 'image/jp2': '1.2.840.10008.1.2.4.90',\n 'image/jpx': '1.2.840.10008.1.2.4.92',\n // Temporary types, until ratified by DICOM committed - TODO\n 'image/jphc': '3.2.840.10008.1.2.4.96',\n 'image/jxl': '1.2.840.10008.1.2.4.140',\n };\n\n if (params['transfer-syntax']) {\n return params['transfer-syntax'];\n } else if (\n contentType &&\n !Object.keys(params).length &&\n defaultTransferSyntaxByType[contentType]\n ) {\n // dcm4che seems to be reporting the content type as just 'image/jp2'?\n return defaultTransferSyntaxByType[contentType];\n } else if (params.type && defaultTransferSyntaxByType[params.type]) {\n return defaultTransferSyntaxByType[params.type];\n } else if (defaultTransferSyntaxByType[contentType]) {\n return defaultTransferSyntaxByType[contentType];\n }\n\n return defaultTransferSyntax;\n}\n\nfunction getImageRetrievalPool() {\n return imageRetrievalPoolManager;\n}\n\nexport interface StreamingData {\n url: string;\n encodedData?: Uint8Array;\n // Some values used by instances of streaming data for range\n totalBytes?: number;\n chunkSize?: number;\n totalRanges?: number;\n rangesFetched?: number;\n}\n\nexport interface CornerstoneWadoRsLoaderOptions\n extends DICOMLoaderImageOptions {\n requestType?: csCoreEnums.RequestType;\n additionalDetails?: {\n imageId: string;\n };\n priority?: number;\n addToBeginning?: boolean;\n retrieveType?: string;\n transferSyntaxUID?: string;\n // Retrieve options are stored to provide sub-options for nested calls\n retrieveOptions?: Types.RangeRetrieveOptions;\n // Streaming data adds information about already streamed results.\n streamingData?: StreamingData;\n}\n\n// TODO: load bulk data items that we might need\n\n// Uncomment this on to test jpegls codec in OHIF\n// const mediaType = 'multipart/related; type=\"image/x-jls\"';\n// const mediaType = 'multipart/related; type=\"application/octet-stream\"; transfer-syntax=\"image/x-jls\"';\nconst mediaType =\n 'multipart/related; type=application/octet-stream; transfer-syntax=*';\n\nfunction loadImage(\n imageId: string,\n options: CornerstoneWadoRsLoaderOptions = {}\n): Types.IImageLoadObject {\n const imageRetrievalPool = getImageRetrievalPool();\n\n const start = new Date().getTime();\n\n const uncompressedIterator = new ProgressiveIterator<DICOMLoaderIImage>(\n 'decompress'\n );\n async function sendXHR(imageURI: string, imageId: string, mediaType: string) {\n uncompressedIterator.generate(async (it) => {\n // get the pixel data from the server\n const compressedIt = ProgressiveIterator.as(\n getPixelData(imageURI, imageId, mediaType, options)\n );\n let lastDecodeLevel = 10;\n for await (const result of compressedIt) {\n const {\n pixelData,\n imageQualityStatus = ImageQualityStatus.FULL_RESOLUTION,\n percentComplete,\n done = true,\n extractDone = true,\n } = result;\n const transferSyntax = getTransferSyntaxForContentType(\n result.contentType\n );\n if (!extractDone && !streamableTransferSyntaxes.has(transferSyntax)) {\n continue;\n }\n const decodeLevel =\n result.decodeLevel ??\n (imageQualityStatus === ImageQualityStatus.FULL_RESOLUTION\n ? 0\n : decodeLevelFromComplete(\n percentComplete,\n options.retrieveOptions?.decodeLevel\n ));\n if (!done && lastDecodeLevel <= decodeLevel) {\n // No point trying again yet\n continue;\n }\n\n try {\n const useOptions = {\n ...options,\n decodeLevel,\n };\n const image = (await createImage(\n imageId,\n pixelData,\n transferSyntax,\n useOptions\n )) as DICOMLoaderIImage;\n\n // add the loadTimeInMS property\n const end = new Date().getTime();\n\n image.loadTimeInMS = end - start;\n image.transferSyntaxUID = transferSyntax;\n image.imageQualityStatus = imageQualityStatus;\n // The iteration is done even if the image itself isn't done yet\n it.add(image, done);\n lastDecodeLevel = decodeLevel;\n } catch (e) {\n if (extractDone) {\n console.warn(\"Couldn't decode\", e);\n throw e;\n }\n }\n }\n });\n }\n\n const requestType =\n options.requestType || csCoreEnums.RequestType.Interaction;\n const additionalDetails = options.additionalDetails || { imageId };\n const priority = options.priority === undefined ? 5 : options.priority;\n const uri = imageId.substring(7);\n\n imageRetrievalPool.addRequest(\n sendXHR.bind(this, uri, imageId, mediaType),\n requestType,\n additionalDetails,\n priority\n );\n\n return {\n promise: uncompressedIterator.getDonePromise(),\n cancelFn: undefined,\n };\n}\n\n/** The decode level is based on how much of hte data is needed for\n * each level. It is a square function, so\n * level 4 only needs 1/25 of the data (eg (4+1)^2). Add 2% to ensure\n * there is enough space\n */\nfunction decodeLevelFromComplete(percent: number, retrieveDecodeLevel = 4) {\n const testSize = percent / 100 - 0.02;\n if (testSize > 1 / 4) {\n return Math.min(retrieveDecodeLevel, 0);\n }\n if (testSize > 1 / 16) {\n return Math.min(retrieveDecodeLevel, 1);\n }\n if (testSize > 1 / 64) {\n return Math.min(retrieveDecodeLevel, 2);\n }\n return Math.min(retrieveDecodeLevel, 3);\n}\n\nexport default loadImage;\n","import { metaData, registerImageLoader, type Types } from '@cornerstonejs/core';\nimport loadImage from './loadImage';\nimport { metaDataProvider } from './metaData';\n\nexport default function () {\n // register wadors scheme and metadata provider\n registerImageLoader('wadors', loadImage as unknown as Types.ImageLoaderFn);\n metaData.addProvider(metaDataProvider);\n}\n","import getNumberString from './metaData/getNumberString';\nimport getNumberValue from './metaData/getNumberValue';\nimport getNumberValues from './metaData/getNumberValues';\nimport getValue from './metaData/getValue';\nimport metaDataProvider from './metaData/metaDataProvider';\nimport findIndexOfString from './findIndexOfString';\nimport getPixelData from './getPixelData';\nimport metaDataManager from './metaDataManager';\nimport loadImage from './loadImage';\nimport register from './register';\n\nconst metaData = {\n getNumberString,\n getNumberValue,\n getNumberValues,\n getValue,\n metaDataProvider,\n};\n\nexport default {\n metaData,\n findIndexOfString,\n getPixelData,\n loadImage,\n metaDataManager,\n register,\n};\n","import wadouriRegister from './wadouri/register';\nimport wadorsRegister from './wadors/register';\n\n/**\n * Register the WADO-URI and WADO-RS image loaders and metaData providers\n * with an instance of Cornerstone Core.\n *\n * @param cornerstone The Cornerstone Core library to register the image loaders with\n */\nfunction registerLoaders(): void {\n wadorsRegister();\n wadouriRegister();\n}\n\nexport default registerLoaders;\n","import { setOptions } from './imageLoader/internal/index';\nimport type { LoaderOptions } from './types';\nimport registerLoaders from './imageLoader/registerLoaders';\nimport { getWebWorkerManager } from '@cornerstonejs/core';\n\nconst workerFn = () => {\n const path = new URL('./decodeImageFrameWorker.js', import.meta.url);\n const instance = new Worker(path, { type: 'module' });\n return instance;\n};\n\nfunction init(options: LoaderOptions): void {\n // setting options should happen first, since we use the options in the\n // cornerstone set\n // DO NOT CHANGE THE ORDER OF THESE TWO LINES!\n setOptions(options);\n registerLoaders();\n\n const workerManager = getWebWorkerManager();\n const maxWorkers = options?.maxWebWorkers || getReasonableWorkerCount();\n workerManager.registerWorker('dicomImageLoader', workerFn, {\n maxWorkerInstances: maxWorkers,\n });\n}\n\nfunction getReasonableWorkerCount(): number {\n if (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) {\n // Use half of the available cores, but at least 1\n return Math.max(1, Math.floor(navigator.hardwareConcurrency / 2));\n }\n // Default to 1 if we can't determine the number of cores\n return 1;\n}\n\nexport default init;\n","import type { Types } from '@cornerstonejs/core';\n\nfunction isJPEGBaseline8BitColor(\n imageFrame: Types.IImageFrame,\n transferSyntax: string\n): boolean {\n /** @todo check as any */\n transferSyntax = transferSyntax || imageFrame.transferSyntax;\n\n if (\n imageFrame.bitsAllocated === 8 &&\n transferSyntax === '1.2.840.10008.1.2.4.50' &&\n (imageFrame.samplesPerPixel === 3 || imageFrame.samplesPerPixel === 4)\n ) {\n return true;\n }\n}\n\nexport default isJPEGBaseline8BitColor;\n","import {\n convertRGBColorByPixel,\n convertRGBColorByPlane,\n convertYBRFullByPixel,\n convertYBRFullByPlane,\n convertPALETTECOLOR,\n} from './colorSpaceConverters/index';\n\nimport { default as wadouri } from './wadouri/index';\nimport { default as wadors } from './wadors/index';\nimport { default as init } from '../init';\nimport { default as convertColorSpace } from './convertColorSpace';\nimport { default as createImage } from './createImage';\nimport { default as decodeJPEGBaseline8BitColor } from './decodeJPEGBaseline8BitColor';\nimport { default as getImageFrame } from './getImageFrame';\nimport { default as getMinMax } from '../shared/getMinMax';\nimport { default as isColorImage } from '../shared/isColorImage';\nimport { default as isJPEGBaseline8BitColor } from './isJPEGBaseline8BitColor';\nimport { default as getPixelData } from './wadors/getPixelData';\nimport { internal } from './internal/index';\n\nconst cornerstoneDICOMImageLoader = {\n convertRGBColorByPixel,\n convertRGBColorByPlane,\n convertYBRFullByPixel,\n convertYBRFullByPlane,\n convertPALETTECOLOR,\n wadouri,\n wadors,\n init,\n convertColorSpace,\n createImage,\n decodeJPEGBaseline8BitColor,\n getImageFrame,\n getPixelData,\n getMinMax,\n isColorImage,\n isJPEGBaseline8BitColor,\n internal,\n};\n\nexport {\n convertRGBColorByPixel,\n convertRGBColorByPlane,\n convertYBRFullByPixel,\n convertYBRFullByPlane,\n convertPALETTECOLOR,\n wadouri,\n wadors,\n init,\n convertColorSpace,\n createImage,\n decodeJPEGBaseline8BitColor,\n getImageFrame,\n getPixelData,\n getMinMax,\n isColorImage,\n isJPEGBaseline8BitColor,\n internal,\n};\n\nexport default cornerstoneDICOMImageLoader;\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__464__","__WEBPACK_EXTERNAL_MODULE__713__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","m","d","definition","key","o","Object","defineProperty","enumerable","get","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","length","i","Error","replace","p","b","baseURI","self","href","imageFrame","colorBuffer","useRGBA","numPixels","rgbIndex","bufferIndex","set","rIndex","gIndex","bIndex","ybrIndex","y","cb","cr","yIndex","cbIndex","crIndex","convertLUTto8Bit","lut","shift","numEntries","cleanedLUT","Uint8ClampedArray","fetchPaletteData","color","fallback","data","Promise","resolve","result","metaData","imageId","then","columns","rows","pixelData","all","rData","gData","bData","len","palIndex","start","redPaletteColorLookupTableDescriptor","rDataCleaned","gDataCleaned","bDataCleaned","getLutDescriptor","dataSet","tag","elements","uint16","getLutData","lutDataSet","lutDescriptor","lutData","byteArray","dataOffset","imagePixelModule","samplesPerPixel","photometricInterpretation","string","bitsAllocated","bitsStored","highBit","pixelRepresentation","planarConfiguration","pixelAspectRatio","smallestPixelValue","largestPixelValue","int16","populateSmallestLargestPixelValues","x00281101","greenPaletteColorLookupTableDescriptor","bluePaletteColorLookupTableDescriptor","numLutEntries","lutBitsAllocated","x00281201","redPaletteColorLookupTableData","greenPaletteColorLookupTableData","bluePaletteColorLookupTableData","populatePaletteColorLut","getLUT","numLUTEntries","firstValueMapped","id","numBitsPerEntry","lutSequence","items","luts","push","sopClassUID","rescaleIntercept","floatString","rescaleSlope","minStoredPixelValue","getMinStoredPixelValue","x00283000","minimumLength","values","valueAsString","split","parseFloat","firstColonIndex","indexOf","url","substring","frameIndex","frame","frameStr","parseInt","scheme","pixelDataFrame","options","open","xhr","beforeSend","beforeProcessing","response","imageCreated","strict","setOptions","newOptions","assign","getOptions","defaultHeaders","params","errorInterceptor","error","request","status","XMLHttpRequest","promise","reject","beforeSendHeaders","responseType","headers","keys","forEach","setRequestHeader","deferred","onloadstart","event","eventData","triggerEvent","eventTarget","onloadend","onreadystatechange","readyState","catch","onprogress","oProgress","loaded","total","percentComplete","lengthComputable","Math","round","onerror","onabort","send","checkToken","token","endIndex","str","offset","uint","Uint8Array","j","charCodeAt","stringToUint8Array","ImageQualityStatus","Enums","extractMultipart","contentType","imageFrameAsArrayBuffer","isPartial","imageQualityStatus","SUBRESOLUTION","FULL_RESOLUTION","tokenIndex","responseHeaders","boundary","multipartContentType","findIndexOfString","header","String","fromCharCode","uint8ArrayToString","substr","findBoundary","trim","findContentType","extractDone","slice","getImageQualityStatus","retrieveOptions","done","ProgressiveIterator","utilities","streamRequest","globalOptions","streamingData","minChunkSize","loadIterator","generate","async","iterator","fetch","signal","responseReader","body","getReader","totalBytes","Number","readDone","encodedData","lastSize","read","appendChunk","byteLength","extracted","detail","add","err","console","getNextPromise","existing","chunk","newDataArray","internal","xhrRequest","parsePartialByteArray","pixelDataSet","dicomParser","untilTag","x7fe00010","warn","log","fragments","totalLength","fragment","position","fixFragments","dataSetFromPartialContent","loadRequest","metadata","uri","fileTotalLength","fetchMore","fetchOptions","_options","fetchedLength","lengthToFetch","arrayBuffer","byteRange","byteArrayToAppend","combinedByteArray","getFrameInformation","PerFrameFunctionalGroupsSequence","SharedFunctionalGroupsSequence","frameNumber","shared","map","it","perFrame","getMultiframeInformation","otherAttributtes","x52009230","x52009229","otherElements","NumberOfFrames","intString","loadedDataSets","_get","_isMultiframeDataset","numberOfFrames","generateMultiframeWADOURIs","listWADOURIs","retrieveMultiframeDataset","frameParameterIndex","retrieveFrameParameterIndex","multiframeURI","isMultiframeDataset","cacheSizeInBytes","promises","getInfo","numberOfDataSetsCached","isLoaded","load","cacheCount","loadDICOMPromise","dicomPart10AsArrayBuffer","partialContent","isPartialContent","ArrayBuffer","flags","action","cacheInfo","unload","purge","includes","multiframeDataSet","multiframeDataset","newElements","clonedDataset","create","combineFrameInstanceDataset","update","loadedDataSet","isNMReconstructable","imageSubType","getImageTypeSubItemFromDataset","index","imageType","subTypes","extractOrientationFromDataset","imageOrientationPatient","getNumberValues","x00209116","modality","x00540022","extractOrientationFromNMMultiframeDataset","extractPositionFromDataset","imagePositionPatient","x00209113","extractPositionFromNMMultiframeDataset","extractSpacingFromDataset","pixelSpacing","x00289110","extractSliceThicknessFromDataset","sliceThickness","x00180050","getInstanceModule","metaDataProvider","types","t","capitalizedData","capitalizeTag","charAt","toUpperCase","instanceModuleNames","getUSEnhancedRegions","sequence","item","physicalDeltaX","double","physicalDeltaY","physicalUnitsXDirection","physicalUnitsYDirection","regionLocationMinY0","regionLocationMaxY1","regionLocationMinX0","regionLocationMaxX1","referencePixelX0","int32","referencePixelY0","referencePhysicalPixelValueY","referencePhysicalPixelValueX","regionSpatialFormat","regionDataType","regionFlags","transducerFrequency","type","MetadataModules","Array","isArray","parsedImageId","parseImageId","MULTIFRAME","multiframeData","multiframeInfo","PerFrameFunctionalInformation","SharedFunctionalInformation","getDirectFrameInformation","dataSetCacheManager","metadataForDataset","GENERAL_STUDY","studyDescription","studyDate","studyTime","accessionNumber","GENERAL_SERIES","seriesInstanceUID","seriesNumber","studyInstanceUID","seriesDate","seriesTime","acquisitionDate","acquisitionTime","GENERAL_IMAGE","sopInstanceUID","instanceNumber","lossyImageCompression","lossyImageCompressionRatio","lossyImageCompressionMethod","PATIENT","patientID","patientName","PATIENT_STUDY","patientAge","patientSize","patientSex","patientWeight","NM_MULTIFRAME_GEOMETRY","IMAGE_PLANE","columnPixelSpacing","rowPixelSpacing","rowCosines","columnCosines","frameOfReferenceUID","sliceLocation","CINE","frameTime","IMAGE_PIXEL","getImagePixelModule","VOI_LUT","modalityLUTOutputPixelRepresentation","getModalityLUTOutputPixelRepresentation","windowCenter","windowWidth","voiLUTSequence","getLUTs","x00283010","MODALITY_LUT","rescaleType","modalityLUTSequence","SOP_COMMON","PET_ISOTOPE","radiopharmaceuticalInfo","x00540016","firstRadiopharmaceuticalInfoDataSet","radiopharmaceuticalStartTime","radionuclideTotalDose","radionuclideHalfLife","OVERLAY_PLANE","overlays","overlayGroup","groupStr","toString","k","byte_as_int","x","description","label","roiArea","roiMean","roiStandardDeviation","getOverlayPlaneModule","transferSyntaxUID","PET_SERIES","correctedImage","units","decayCorrection","PET_IMAGE","frameReferenceTime","actualFrameDuration","ULTRASOUND_ENHANCED_REGION","CALIBRATION","sequenceOfUltrasoundRegions","files","file","remove","getEncapsulatedImageFrame","basicOffsetTable","readEncapsulatedImageFrame","framesAreFragmented","createJPEGBasicOffsetTable","byteStream","ByteStream","byteArrayParser","readSequenceItem","seek","fragmentZeroPosition","byteOffset","buffer","isBitSet","byte","bitPos","frameOffset","pixelsPerFrame","floor","pixelDataElement","x7fe00008","pixelDataOffset","unpackBinaryFrame","fileIndex","fileManager","fileReader","FileReader","onload","target","readAsArrayBuffer","encapsulatedPixelData","getUncompressedImageFrame","storedPixelData","storedPixel","min","max","convertRGB","convertRGBColorByPixel","convertRGBColorByPlane","convertColorSpace","convertPALETTECOLOR","y1","y2","convertYBRFull422ByPixel","convertYBRFullByPixel","convertYBRFullByPlane","convertYBRFull","arrayBufferToString","binary","decodeURIComponent","escape","_error","URIError","binaryToString","apply","canvas","Date","getTime","imgBlob","Blob","readAsBinaryString","img","Image","height","width","context","getContext","drawImage","imageData","getImageData","end","decodeTimeInMS","minMax","getMinMax","pixelDataLength","btoa","processDecodeTask","transferSyntax","srcOptions","decodeConfig","loader","webWorkerManager","getWebWorkerManager","priority","transferPixelData","executeTask","requestType","decodeJPEGBaseline8BitColor","photoMetricInterpretation","lastImageIdDrawn","setPixelDataType","TypedArray","pixelDataType","isInteger","Uint16Array","Int8Array","Int16Array","Float32Array","getPixelDataTypeFromMinMax","typedArray","preScale","enabled","createElement","getImageFrame","decodeLevel","allowFloatRendering","canRenderFloatTextures","scalingParameters","modalityLutModule","generalSeriesModule","suvFactor","suvbw","getScalingParameters","decodePromise","decodeImageFrame","isColorImage","isColorImageFn","alreadyTyped","targetBuffer","rawOffset","rawLength","imageFrameLength","typedArrayConstructors","TypedArrayConstructor","imagePlaneModule","voiLutModule","sopCommonModule","calibrationModule","endsWith","ceil","isColorConversionRequired","createImageData","removeAFromRGBA","voxelManager","scalarData","numberOfComponents","image","dataType","constructor","name","calibration","intercept","slope","invert","minPixelValue","maxPixelValue","sizeInBytes","voiLUTFunction","floatPixelData","rgba","getPixelData","getCanvas","sopClassUid","ctx","arr","putImageData","modalityLUT","voiLUT","minVoi","maxVoi","loadImageFromPromise","dataSetPromise","sharedCacheKey","callbacks","imageLoadObject","cancelFn","loadEnd","imagePromise","createImage","decache","addDecache","loadTimeInMS","totalTimeInMS","imageDoneCallback","getLoaderForScheme","loadFileRequest","loadImage","schemeLoader","loadImageFromDataSet","registerImageLoader","register","element","defaultValue","Value","getValue","imageIdToURI","colonIndex","getTagValue","justElement","filter","rest","metadataByImageURI","multiframeMetadataByImageURI","_retrieveMultiframeMetadataImageURI","imageURI","lastSlashIdx","imageIdFrameless","isMultiframe","cachedMetadata","retrievedMetadata","firstFrameMetadata","combined","instance","newInstance","entries","combineFrameInstance","isNMModality","getImageTypeSubItemFromMetadata","extractOrientationFromMetadata","detectorInformationSequence","extractOrientationFromNMMultiframeMetadata","extractPositionFromMetadata","extractPositionFromNMMultiframeMetadata","getFirstNumberValue","getSequenceItems","getTransferSyntax","retrieveMultiframeMetadataImageId","metaDataManager","getNumberValue","spacingBetweenSlices","usingDefaultValues","IMAGE_URL","isVideo","imageUrl","thumbnail","rendered","getImageUrlModule","cineRate","getCineModule","radiopharmaceuticalStartDateTime","rangeRequest","chunkSize","attr","rangesFetched","rangeIndex","getByteRange","range","Range","responseArrayBuffer","responseTypedArray","newByteArray","contentRange","MAX_SAFE_INTEGER","fetchRangeAndAppend","doneAllBytes","extract","mediaType","Accept","urlArguments","framesPath","streaming","loadPromise","getResponseHeader","streamableTransferSyntaxes","Set","getTransferSyntaxForContentType","defaultTransferSyntax","parameters","parameter","parameterValues","defaultTransferSyntaxByType","decodeLevelFromComplete","percent","retrieveDecodeLevel","testSize","imageRetrievalPool","imageRetrievalPoolManager","uncompressedIterator","csCoreEnums","additionalDetails","addRequest","compressedIt","as","lastDecodeLevel","has","useOptions","bind","getDonePromise","getNumberString","wadorsRegister","wadouriRegister","workerFn","path","URL","Worker","registerLoaders","workerManager","maxWorkers","maxWebWorkers","navigator","hardwareConcurrency","getReasonableWorkerCount","registerWorker","maxWorkerInstances","wadouri","wadors","init","isJPEGBaseline8BitColor"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"cornerstoneDICOMImageLoader.min.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///external umd \"@cornerstonejs/core\"","webpack:///external umd {\"commonjs\":\"dicom-parser\",\"commonjs2\":\"dicom-parser\",\"amd\":\"dicom-parser\",\"root\":\"dicomParser\"}","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/get javascript chunk filename","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/jsonp chunk loading","webpack:///./imageLoader/colorSpaceConverters/convertRGBColorByPixel.ts","webpack:///./imageLoader/colorSpaceConverters/convertRGBColorByPlane.ts","webpack:///./imageLoader/colorSpaceConverters/convertYBRFullByPixel.ts","webpack:///./imageLoader/colorSpaceConverters/convertYBRFullByPlane.ts","webpack:///./imageLoader/colorSpaceConverters/convertPALETTECOLOR.ts","webpack:///./imageLoader/wadouri/metaData/getImagePixelModule.ts","webpack:///./imageLoader/wadouri/metaData/getLUTs.ts","webpack:///./imageLoader/wadouri/metaData/getModalityLUTOutputPixelRepresentation.ts","webpack:///./imageLoader/wadouri/metaData/getNumberValues.ts","webpack:///./imageLoader/wadouri/parseImageId.ts","webpack:///./imageLoader/internal/options.ts","webpack:///./imageLoader/internal/xhrRequest.ts","webpack:///./imageLoader/wadors/findIndexOfString.ts","webpack:///./imageLoader/wadors/extractMultipart.ts","webpack:///./imageLoader/wadors/getImageQualityStatus.ts","webpack:///./imageLoader/internal/streamRequest.ts","webpack:///./imageLoader/internal/index.ts","webpack:///./imageLoader/wadouri/dataset-from-partial-content.ts","webpack:///./imageLoader/wadouri/combineFrameInstanceDataset.ts","webpack:///./imageLoader/wadouri/loadedDataSets.ts","webpack:///./imageLoader/wadouri/retrieveMultiframeDataset.ts","webpack:///./imageLoader/wadouri/dataSetCacheManager.ts","webpack:///./imageLoader/isNMReconstructable.ts","webpack:///./imageLoader/wadouri/metaData/extractPositioningFromDataset.ts","webpack:///./imageLoader/getInstanceModule.ts","webpack:///./imageLoader/wadouri/metaData/USHelpers.ts","webpack:///./imageLoader/wadouri/metaData/metaDataProvider.ts","webpack:///./imageLoader/wadouri/metaData/getOverlayPlaneModule.ts","webpack:///./imageLoader/wadouri/fileManager.ts","webpack:///./imageLoader/wadouri/getEncapsulatedImageFrame.ts","webpack:///./imageLoader/wadouri/unpackBinaryFrame.ts","webpack:///./imageLoader/wadouri/getUncompressedImageFrame.ts","webpack:///./imageLoader/wadouri/loadFileRequest.ts","webpack:///./imageLoader/wadouri/getPixelData.ts","webpack:///./shared/getMinMax.ts","webpack:///./imageLoader/convertColorSpace.ts","webpack:///./imageLoader/colorSpaceConverters/convertYBRFull422ByPixel.ts","webpack:///./imageLoader/decodeJPEGBaseline8BitColor.ts","webpack:///./imageLoader/decodeImageFrame.ts","webpack:///./imageLoader/getImageFrame.ts","webpack:///./shared/isColorImage.ts","webpack:///./imageLoader/createImage.ts","webpack:///./shared/getPixelDataTypeFromMinMax.ts","webpack:///./imageLoader/getScalingParameters.ts","webpack:///./imageLoader/isColorConversionRequired.ts","webpack:///./imageLoader/wadouri/loadImage.ts","webpack:///./imageLoader/wadouri/register.ts","webpack:///./imageLoader/wadouri/index.ts","webpack:///./imageLoader/wadors/metaData/getValue.ts","webpack:///./imageLoader/wadors/metaData/getNumberString.ts","webpack:///./imageLoader/wadors/metaData/getNumberValue.ts","webpack:///./imageLoader/wadors/metaData/getNumberValues.ts","webpack:///./imageLoader/imageIdToURI.ts","webpack:///./imageLoader/wadors/getTagValue.ts","webpack:///./imageLoader/wadors/combineFrameInstance.ts","webpack:///./imageLoader/wadors/metaDataManager.ts","webpack:///./imageLoader/wadors/metaData/NMHelpers.ts","webpack:///./imageLoader/wadors/metaData/extractPositioningFromMetadata.ts","webpack:///./imageLoader/wadors/metaData/getFirstNumberValue.ts","webpack:///./imageLoader/wadors/metaData/getSequenceItems.ts","webpack:///./imageLoader/wadors/metaData/USHelpers.ts","webpack:///./imageLoader/wadors/metaData/metaDataProvider.ts","webpack:///./imageLoader/wadors/metaData/getOverlayPlaneModule.ts","webpack:///./imageLoader/internal/rangeRequest.ts","webpack:///./imageLoader/wadors/getPixelData.ts","webpack:///./imageLoader/wadors/loadImage.ts","webpack:///./imageLoader/wadors/register.ts","webpack:///./imageLoader/wadors/index.ts","webpack:///./imageLoader/registerLoaders.ts","webpack:///./init.ts","webpack:///./imageLoader/isJPEGBaseline8BitColor.ts","webpack:///./imageLoader/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@cornerstonejs/core\"), require(\"dicom-parser\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstoneDICOMImageLoader\", [\"@cornerstonejs/core\", \"dicom-parser\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstoneDICOMImageLoader\"] = factory(require(\"@cornerstonejs/core\"), require(\"dicom-parser\"));\n\telse\n\t\troot[\"cornerstoneDICOMImageLoader\"] = factory(root[\"@cornerstonejs/core\"], root[\"dicomParser\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__464__, __WEBPACK_EXTERNAL_MODULE__713__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__464__;","module.exports = __WEBPACK_EXTERNAL_MODULE__713__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".min.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && !scriptUrl) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t527: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// no jsonp function","import type { ByteArray } from 'dicom-parser';\n\nexport default function (\n imageFrame: ByteArray,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n if (imageFrame === undefined) {\n throw new Error('decodeRGB: rgbBuffer must be defined');\n }\n if (imageFrame.length % 3 !== 0) {\n throw new Error(\n `decodeRGB: rgbBuffer length ${imageFrame.length} must be divisible by 3`\n );\n }\n\n const numPixels = imageFrame.length / 3;\n\n let rgbIndex = 0;\n\n let bufferIndex = 0;\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; i++) {\n colorBuffer[bufferIndex++] = imageFrame[rgbIndex++]; // red\n colorBuffer[bufferIndex++] = imageFrame[rgbIndex++]; // green\n colorBuffer[bufferIndex++] = imageFrame[rgbIndex++]; // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n }\n\n return;\n }\n\n // if RGB buffer\n colorBuffer.set(imageFrame);\n}\n","import type { ByteArray } from 'dicom-parser';\n\nexport default function (\n imageFrame: ByteArray,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n if (imageFrame === undefined) {\n throw new Error('decodeRGB: rgbBuffer must be defined');\n }\n if (imageFrame.length % 3 !== 0) {\n throw new Error(\n `decodeRGB: rgbBuffer length ${imageFrame.length} must be divisible by 3`\n );\n }\n\n const numPixels = imageFrame.length / 3;\n\n let bufferIndex = 0;\n\n let rIndex = 0;\n\n let gIndex = numPixels;\n\n let bIndex = numPixels * 2;\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; i++) {\n colorBuffer[bufferIndex++] = imageFrame[rIndex++]; // red\n colorBuffer[bufferIndex++] = imageFrame[gIndex++]; // green\n colorBuffer[bufferIndex++] = imageFrame[bIndex++]; // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n }\n } else {\n for (let i = 0; i < numPixels; i++) {\n colorBuffer[bufferIndex++] = imageFrame[rIndex++]; // red\n colorBuffer[bufferIndex++] = imageFrame[gIndex++]; // green\n colorBuffer[bufferIndex++] = imageFrame[bIndex++]; // blue\n }\n }\n}\n","import type { ByteArray } from 'dicom-parser';\n\nexport default function (\n imageFrame: ByteArray,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n if (imageFrame === undefined) {\n throw new Error('convertYBRFullByPixel: ybrBuffer must be defined');\n }\n if (imageFrame.length % 3 !== 0) {\n throw new Error(\n `convertYBRFullByPixel: ybrBuffer length ${imageFrame.length} must be divisible by 3`\n );\n }\n\n const numPixels = imageFrame.length / 3;\n\n let ybrIndex = 0;\n\n let bufferIndex = 0;\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; i++) {\n const y = imageFrame[ybrIndex++];\n const cb = imageFrame[ybrIndex++];\n const cr = imageFrame[ybrIndex++];\n\n colorBuffer[bufferIndex++] = y + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y + 1.772 * (cb - 128); // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n }\n\n return;\n }\n\n for (let i = 0; i < numPixels; i++) {\n const y = imageFrame[ybrIndex++];\n const cb = imageFrame[ybrIndex++];\n const cr = imageFrame[ybrIndex++];\n\n colorBuffer[bufferIndex++] = y + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y + 1.772 * (cb - 128); // blue\n }\n}\n","import type { ByteArray } from 'dicom-parser';\n\nexport default function (\n imageFrame: ByteArray,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n if (imageFrame === undefined) {\n throw new Error('convertYBRFullByPlane: ybrBuffer must be defined');\n }\n if (imageFrame.length % 3 !== 0) {\n throw new Error(\n `convertYBRFullByPlane: ybrBuffer length ${imageFrame.length} must be divisible by 3`\n );\n }\n\n const numPixels = imageFrame.length / 3;\n\n let bufferIndex = 0;\n\n let yIndex = 0;\n\n let cbIndex = numPixels;\n\n let crIndex = numPixels * 2;\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; i++) {\n const y = imageFrame[yIndex++];\n const cb = imageFrame[cbIndex++];\n const cr = imageFrame[crIndex++];\n\n colorBuffer[bufferIndex++] = y + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y + 1.772 * (cb - 128); // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n }\n\n return;\n }\n\n for (let i = 0; i < numPixels; i++) {\n const y = imageFrame[yIndex++];\n const cb = imageFrame[cbIndex++];\n const cr = imageFrame[crIndex++];\n\n colorBuffer[bufferIndex++] = y + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y + 1.772 * (cb - 128); // blue\n }\n}\n","import type { ByteArray } from 'dicom-parser';\nimport { metaData, type Types } from '@cornerstonejs/core';\n\nfunction convertLUTto8Bit(lut: number[], shift: number) {\n const numEntries = lut.length;\n const cleanedLUT = new Uint8ClampedArray(numEntries);\n\n for (let i = 0; i < numEntries; ++i) {\n cleanedLUT[i] = lut[i] >> shift;\n }\n\n return cleanedLUT;\n}\n\nfunction fetchPaletteData(imageFrame, color, fallback) {\n const data = imageFrame[`${color}PaletteColorLookupTableData`];\n if (data) {\n return Promise.resolve(data);\n }\n\n const result = metaData.get('imagePixelModule', imageFrame.imageId);\n\n if (result && typeof result.then === 'function') {\n return result.then((module) =>\n module ? module[`${color}PaletteColorLookupTableData`] : fallback\n );\n } else {\n return Promise.resolve(\n result ? result[`${color}PaletteColorLookupTableData`] : fallback\n );\n }\n}\n\n/**\n * Convert pixel data with PALETTE COLOR Photometric Interpretation to RGBA\n *\n * @param imageFrame - The ImageFrame to convert\n * @param colorBuffer - The buffer to write the converted pixel data to\n * @returns\n */\nexport default function (\n imageFrame: Types.IImageFrame,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n const numPixels = imageFrame.columns * imageFrame.rows;\n const pixelData = imageFrame.pixelData;\n\n Promise.all([\n fetchPaletteData(imageFrame, 'red', null),\n fetchPaletteData(imageFrame, 'green', null),\n fetchPaletteData(imageFrame, 'blue', null),\n ]).then(([rData, gData, bData]) => {\n if (!rData || !gData || !bData) {\n throw new Error(\n 'The image does not have a complete color palette. R, G, and B palette data are required.'\n );\n }\n\n const len = rData.length;\n let palIndex = 0;\n let bufferIndex = 0;\n\n const start = imageFrame.redPaletteColorLookupTableDescriptor[1];\n const shift =\n imageFrame.redPaletteColorLookupTableDescriptor[2] === 8 ? 0 : 8;\n\n const rDataCleaned = convertLUTto8Bit(rData, shift);\n const gDataCleaned = convertLUTto8Bit(gData, shift);\n const bDataCleaned = convertLUTto8Bit(bData, shift);\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; ++i) {\n let value = pixelData[palIndex++];\n\n if (value < start) {\n value = 0;\n } else if (value > start + len - 1) {\n value = len - 1;\n } else {\n value -= start;\n }\n\n colorBuffer[bufferIndex++] = rDataCleaned[value];\n colorBuffer[bufferIndex++] = gDataCleaned[value];\n colorBuffer[bufferIndex++] = bDataCleaned[value];\n colorBuffer[bufferIndex++] = 255;\n }\n\n return;\n }\n\n for (let i = 0; i < numPixels; ++i) {\n let value = pixelData[palIndex++];\n\n if (value < start) {\n value = 0;\n } else if (value > start + len - 1) {\n value = len - 1;\n } else {\n value -= start;\n }\n\n colorBuffer[bufferIndex++] = rDataCleaned[value];\n colorBuffer[bufferIndex++] = gDataCleaned[value];\n colorBuffer[bufferIndex++] = bDataCleaned[value];\n }\n });\n}\n","import type { Types } from '@cornerstonejs/core';\nimport type { DataSet } from 'dicom-parser';\n\nfunction getLutDescriptor(dataSet: DataSet, tag: string) {\n if (!dataSet.elements[tag] || dataSet.elements[tag].length !== 6) {\n return;\n }\n\n return [\n dataSet.uint16(tag, 0),\n dataSet.uint16(tag, 1),\n dataSet.uint16(tag, 2),\n ];\n}\n\nfunction getLutData(lutDataSet: DataSet, tag: string, lutDescriptor): number[] {\n const lut = [];\n const lutData = lutDataSet.elements[tag];\n\n for (let i = 0; i < lutDescriptor[0]; i++) {\n // Output range is always unsigned\n if (lutDescriptor[2] === 16) {\n lut[i] = lutDataSet.uint16(tag, i);\n } else {\n lut[i] = lutDataSet.byteArray[i + lutData.dataOffset];\n }\n }\n\n return lut;\n}\n\nfunction populatePaletteColorLut(\n dataSet: DataSet,\n imagePixelModule: Types.ImagePixelModuleMetadata\n) {\n imagePixelModule.redPaletteColorLookupTableDescriptor = getLutDescriptor(\n dataSet,\n 'x00281101'\n );\n imagePixelModule.greenPaletteColorLookupTableDescriptor = getLutDescriptor(\n dataSet,\n 'x00281102'\n );\n imagePixelModule.bluePaletteColorLookupTableDescriptor = getLutDescriptor(\n dataSet,\n 'x00281103'\n );\n\n // The first Palette Color Lookup Table Descriptor value is the number of entries in the lookup table.\n // When the number of table entries is equal to 2ˆ16 then this value shall be 0.\n // See http://dicom.nema.org/MEDICAL/DICOM/current/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.5\n if (imagePixelModule.redPaletteColorLookupTableDescriptor[0] === 0) {\n imagePixelModule.redPaletteColorLookupTableDescriptor[0] = 65536;\n imagePixelModule.greenPaletteColorLookupTableDescriptor[0] = 65536;\n imagePixelModule.bluePaletteColorLookupTableDescriptor[0] = 65536;\n }\n\n // The third Palette Color Lookup Table Descriptor value specifies the number of bits for each entry in the Lookup Table Data.\n // It shall take the value of 8 or 16.\n // The LUT Data shall be stored in a format equivalent to 8 bits allocated when the number of bits for each entry is 8, and 16 bits allocated when the number of bits for each entry is 16, where in both cases the high bit is equal to bits allocated-1.\n // The third value shall be identical for each of the Red, Green and Blue Palette Color Lookup Table Descriptors.\n //\n // Note: Some implementations have encoded 8 bit entries with 16 bits allocated, padding the high bits;\n // this can be detected by comparing the number of entries specified in the LUT Descriptor with the actual value length of the LUT Data entry.\n // The value length in bytes should equal the number of entries if bits allocated is 8, and be twice as long if bits allocated is 16.\n const numLutEntries =\n imagePixelModule.redPaletteColorLookupTableDescriptor[0];\n const lutData = dataSet.elements.x00281201;\n const lutBitsAllocated = lutData.length === numLutEntries ? 8 : 16;\n\n // If the descriptors do not appear to have the correct values, correct them\n if (\n imagePixelModule.redPaletteColorLookupTableDescriptor[2] !==\n lutBitsAllocated\n ) {\n imagePixelModule.redPaletteColorLookupTableDescriptor[2] = lutBitsAllocated;\n imagePixelModule.greenPaletteColorLookupTableDescriptor[2] =\n lutBitsAllocated;\n imagePixelModule.bluePaletteColorLookupTableDescriptor[2] =\n lutBitsAllocated;\n }\n\n imagePixelModule.redPaletteColorLookupTableData = getLutData(\n dataSet,\n 'x00281201',\n imagePixelModule.redPaletteColorLookupTableDescriptor\n );\n imagePixelModule.greenPaletteColorLookupTableData = getLutData(\n dataSet,\n 'x00281202',\n imagePixelModule.greenPaletteColorLookupTableDescriptor\n );\n imagePixelModule.bluePaletteColorLookupTableData = getLutData(\n dataSet,\n 'x00281203',\n imagePixelModule.bluePaletteColorLookupTableDescriptor\n );\n}\n\nfunction populateSmallestLargestPixelValues(\n dataSet: DataSet,\n imagePixelModule: Types.ImagePixelModuleMetadata\n) {\n const pixelRepresentation = dataSet.uint16('x00280103');\n\n if (pixelRepresentation === 0) {\n imagePixelModule.smallestPixelValue = dataSet.uint16('x00280106');\n imagePixelModule.largestPixelValue = dataSet.uint16('x00280107');\n } else {\n imagePixelModule.smallestPixelValue = dataSet.int16('x00280106');\n imagePixelModule.largestPixelValue = dataSet.int16('x00280107');\n }\n}\n\nfunction getImagePixelModule(dataSet: DataSet): Types.ImagePixelModuleMetadata {\n const imagePixelModule = {\n samplesPerPixel: dataSet.uint16('x00280002'),\n photometricInterpretation: dataSet.string('x00280004'),\n rows: dataSet.uint16('x00280010'),\n columns: dataSet.uint16('x00280011'),\n bitsAllocated: dataSet.uint16('x00280100'),\n bitsStored: dataSet.uint16('x00280101'),\n highBit: dataSet.uint16('x00280102'),\n pixelRepresentation: dataSet.uint16('x00280103'),\n planarConfiguration: dataSet.uint16('x00280006'),\n pixelAspectRatio: dataSet.string('x00280034'),\n } as Types.ImagePixelModuleMetadata;\n\n populateSmallestLargestPixelValues(dataSet, imagePixelModule);\n\n if (\n imagePixelModule.photometricInterpretation === 'PALETTE COLOR' &&\n dataSet.elements.x00281101\n ) {\n populatePaletteColorLut(dataSet, imagePixelModule);\n }\n\n return imagePixelModule;\n}\n\nexport default getImagePixelModule;\n","import type { DataSet, Element } from 'dicom-parser';\nimport type { LutType } from '../../../types';\n\nfunction getLUT(pixelRepresentation: number, lutDataSet: DataSet): LutType {\n let numLUTEntries = lutDataSet.uint16('x00283002', 0);\n\n if (numLUTEntries === 0) {\n numLUTEntries = 65535;\n }\n let firstValueMapped = 0;\n\n if (pixelRepresentation === 0) {\n firstValueMapped = lutDataSet.uint16('x00283002', 1);\n } else {\n firstValueMapped = lutDataSet.int16('x00283002', 1);\n }\n const numBitsPerEntry = lutDataSet.uint16('x00283002', 2);\n // console.log('LUT(', numLUTEntries, ',', firstValueMapped, ',', numBitsPerEntry, ')');\n const lut = {\n id: '1',\n firstValueMapped,\n numBitsPerEntry,\n lut: [],\n };\n\n // console.log(\"minValue=\", minValue, \"; maxValue=\", maxValue);\n for (let i = 0; i < numLUTEntries; i++) {\n if (pixelRepresentation === 0) {\n lut.lut[i] = lutDataSet.uint16('x00283006', i);\n } else {\n lut.lut[i] = lutDataSet.int16('x00283006', i);\n }\n }\n\n return lut;\n}\n\nfunction getLUTs(pixelRepresentation: number, lutSequence: Element): LutType[] {\n if (!lutSequence || !lutSequence.items || !lutSequence.items.length) {\n return;\n }\n const luts: LutType[] = [];\n\n for (let i = 0; i < lutSequence.items.length; i++) {\n const lutDataSet = lutSequence.items[i].dataSet;\n const lut = getLUT(pixelRepresentation, lutDataSet);\n\n if (lut) {\n luts.push(lut);\n }\n }\n\n return luts;\n}\n\nexport default getLUTs;\n","/* eslint no-bitwise: 0 */\n\nimport type { DataSet } from 'dicom-parser';\n\nfunction getMinStoredPixelValue(dataSet: DataSet) {\n const pixelRepresentation = dataSet.uint16('x00280103');\n const bitsStored = dataSet.uint16('x00280101');\n\n if (pixelRepresentation === 0) {\n return 0;\n }\n\n return -1 << (bitsStored - 1);\n}\n\n// 0 = unsigned / US, 1 = signed / SS\nfunction getModalityLUTOutputPixelRepresentation(dataSet: DataSet) {\n // CT SOP Classes are always signed\n const sopClassUID = dataSet.string('x00080016');\n\n if (\n sopClassUID === '1.2.840.10008.5.1.4.1.1.2' ||\n sopClassUID === '1.2.840.10008.5.1.4.1.1.2.1'\n ) {\n return 1;\n }\n\n // if rescale intercept and rescale slope are present, pass the minimum stored\n // pixel value through them to see if we get a signed output range\n const rescaleIntercept = dataSet.floatString('x00281052');\n const rescaleSlope = dataSet.floatString('x00281053');\n\n if (rescaleIntercept !== undefined && rescaleSlope !== undefined) {\n const minStoredPixelValue = getMinStoredPixelValue(dataSet); //\n const minModalityLutValue =\n minStoredPixelValue * rescaleSlope + rescaleIntercept;\n\n if (minModalityLutValue < 0) {\n return 1;\n }\n\n return 0;\n }\n\n // Output of non linear modality lut is always unsigned\n if (dataSet.elements.x00283000 && dataSet.elements.x00283000.length > 0) {\n return 0;\n }\n\n // If no modality lut transform, output is same as pixel representation\n return dataSet.uint16('x00280103');\n}\n\nexport default getModalityLUTOutputPixelRepresentation;\n","import type { DataSet } from 'dicom-parser';\n\nfunction getNumberValues(\n dataSet: DataSet,\n tag: string,\n minimumLength: number\n): number[] {\n const values = [];\n const valueAsString = dataSet.string(tag);\n\n if (!valueAsString) {\n return;\n }\n const split = valueAsString.split('\\\\');\n\n if (minimumLength && split.length < minimumLength) {\n return;\n }\n for (let i = 0; i < split.length; i++) {\n values.push(parseFloat(split[i]));\n }\n\n return values;\n}\n\nexport default getNumberValues;\n","export interface CornerstoneImageUrl {\n scheme: string;\n url: string;\n frame: number;\n pixelDataFrame: number;\n}\n\nfunction parseImageId(imageId: string): CornerstoneImageUrl {\n // build a url by parsing out the url scheme and frame index from the imageId\n const firstColonIndex = imageId.indexOf(':');\n\n let url = imageId.substring(firstColonIndex + 1);\n const frameIndex = url.indexOf('frame=');\n\n let frame;\n\n if (frameIndex !== -1) {\n const frameStr = url.substring(frameIndex + 6);\n\n frame = parseInt(frameStr, 10);\n url = url.substring(0, frameIndex - 1);\n }\n\n const scheme = imageId.substring(0, firstColonIndex);\n /**\n * Why we adjust frameNumber? since in the above we are extracting the\n * frame number from the imageId (from the metadata), and the frame number\n * starts from 1, but in the loader which uses the dicomParser\n * the frame number starts from 0.\n */\n\n const adjustedFrame = frame !== undefined ? frame - 1 : undefined;\n\n return {\n scheme,\n url,\n frame,\n pixelDataFrame: adjustedFrame,\n };\n}\n\nexport default parseImageId;\n","import type { LoaderOptions } from '../../types';\n\nlet options: LoaderOptions = {\n // callback to open the object\n open(xhr, url) {\n xhr.open('get', url, true);\n },\n // callback allowing customization of the xhr (e.g. adding custom auth headers, cors, etc)\n beforeSend(/* xhr, imageId */) {\n // before send code\n },\n // callback allowing modification of the xhr response before creating image objects\n beforeProcessing(xhr: XMLHttpRequest) {\n return Promise.resolve(xhr.response as ArrayBuffer);\n },\n // callback allowing modification of newly created image objects\n imageCreated(/* image */) {\n // image created code\n },\n strict: false,\n};\n\nexport function setOptions(newOptions: LoaderOptions): void {\n options = Object.assign(options, newOptions);\n}\n\nexport function getOptions(): LoaderOptions {\n return options;\n}\n","import { getOptions } from './options';\nimport type {\n LoaderXhrRequestError,\n LoaderXhrRequestParams,\n LoaderXhrRequestPromise,\n} from '../../types';\nimport { triggerEvent, eventTarget } from '@cornerstonejs/core';\n\nfunction xhrRequest(\n url: string,\n imageId: string,\n defaultHeaders: Record<string, string> = {},\n params: LoaderXhrRequestParams = {}\n): LoaderXhrRequestPromise<ArrayBuffer> {\n const options = getOptions();\n\n const errorInterceptor = (xhr: XMLHttpRequest) => {\n if (typeof options.errorInterceptor === 'function') {\n const error = new Error('request failed') as LoaderXhrRequestError;\n\n error.request = xhr;\n error.response = xhr.response;\n error.status = xhr.status;\n options.errorInterceptor(error);\n }\n };\n\n const xhr = new XMLHttpRequest();\n\n // Make the request for the DICOM P10 SOP Instance\n const promise: LoaderXhrRequestPromise<ArrayBuffer> =\n new Promise<ArrayBuffer>((resolve, reject) => {\n options.open(xhr, url, defaultHeaders, params);\n const beforeSendHeaders = options.beforeSend(\n xhr,\n imageId,\n defaultHeaders,\n params\n );\n\n xhr.responseType = 'arraybuffer';\n\n const headers = Object.assign({}, defaultHeaders, beforeSendHeaders);\n\n Object.keys(headers).forEach(function (key) {\n if (headers[key] === null) {\n return;\n }\n if (key === 'Accept' && url.indexOf('accept=') !== -1) {\n return;\n }\n xhr.setRequestHeader(key, headers[key]);\n });\n\n params.deferred = {\n resolve,\n reject,\n };\n params.url = url;\n params.imageId = imageId;\n\n // Event triggered when downloading an image starts\n xhr.onloadstart = function (event) {\n // Action\n if (options.onloadstart) {\n options.onloadstart(event, params);\n }\n\n // Event\n const eventData = {\n url,\n imageId,\n };\n\n triggerEvent(eventTarget, 'cornerstoneimageloadstart', eventData);\n };\n\n // Event triggered when downloading an image ends\n xhr.onloadend = function (event) {\n // Action\n if (options.onloadend) {\n options.onloadend(event, params);\n }\n\n const eventData = {\n url,\n imageId,\n };\n\n // Event\n triggerEvent(eventTarget, 'cornerstoneimageloadend', eventData);\n };\n\n // handle response data\n xhr.onreadystatechange = function (event) {\n // Action\n if (options.onreadystatechange) {\n options.onreadystatechange(event, params);\n\n return;\n }\n\n // Default action\n // TODO: consider sending out progress messages here as we receive\n // the pixel data\n if (xhr.readyState === 4) {\n // Status OK (200) and partial content (206) are both handled\n if (xhr.status === 200 || xhr.status === 206) {\n options\n .beforeProcessing(xhr)\n .then(resolve)\n .catch(() => {\n errorInterceptor(xhr);\n // request failed, reject the Promise\n reject(xhr);\n });\n } else {\n errorInterceptor(xhr);\n // request failed, reject the Promise\n reject(xhr);\n }\n }\n };\n\n // Event triggered when downloading an image progresses\n xhr.onprogress = function (oProgress) {\n // console.log('progress:',oProgress)\n const loaded = oProgress.loaded; // evt.loaded the bytes browser receive\n\n let total: number;\n\n let percentComplete: number;\n\n if (oProgress.lengthComputable) {\n total = oProgress.total; // evt.total the total bytes seted by the header\n percentComplete = Math.round((loaded / total) * 100);\n }\n\n // Action\n if (options.onprogress) {\n options.onprogress(oProgress, params);\n }\n };\n xhr.onerror = function () {\n errorInterceptor(xhr);\n reject(xhr);\n };\n\n xhr.onabort = function () {\n errorInterceptor(xhr);\n reject(xhr);\n };\n xhr.send();\n });\n\n promise.xhr = xhr;\n\n return promise;\n}\n\nexport default xhrRequest;\n","function checkToken(token, data, dataOffset): boolean {\n if (dataOffset + token.length > data.length) {\n return false;\n }\n\n let endIndex = dataOffset;\n\n for (let i = 0; i < token.length; i++) {\n if (token[i] !== data[endIndex++]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction stringToUint8Array(str: string): Uint8Array {\n const uint = new Uint8Array(str.length);\n\n for (let i = 0, j = str.length; i < j; i++) {\n uint[i] = str.charCodeAt(i);\n }\n\n return uint;\n}\n\nfunction findIndexOfString(\n data: Uint8Array,\n str: string,\n offset?: number\n): number {\n offset = offset || 0;\n\n const token = stringToUint8Array(str);\n\n for (let i = offset; i < data.length; i++) {\n if (token[0] === data[i]) {\n // console.log('match @', i);\n if (checkToken(token, data, i)) {\n return i;\n }\n }\n }\n\n return -1;\n}\nexport default findIndexOfString;\n","import { Enums } from '@cornerstonejs/core';\nimport findIndexOfString from './findIndexOfString';\n\nconst { ImageQualityStatus } = Enums;\n/**\n * Extracts multipart/related data or single part data from a response byte\n * array.\n *\n * @param contentType - guess of the root content type\n * @param imageFrameAsArrayBuffer - array buffer containing the image frame\n * @param options - contains already computed values from\n * earlier calls, allowing additional calls to be made to fetch\n * additional data.\n * @param isPartial - indicates the file may end partially\n * @returns a compressed image frame containing the pixel data.\n */\nexport default function extractMultipart(\n contentType: string,\n imageFrameAsArrayBuffer,\n options?\n) {\n options ||= {};\n // request succeeded, Parse the multi-part mime response\n const response = new Uint8Array(imageFrameAsArrayBuffer);\n const isPartial = !!options?.isPartial;\n if (contentType.indexOf('multipart') === -1) {\n return {\n contentType,\n imageQualityStatus: isPartial\n ? ImageQualityStatus.SUBRESOLUTION\n : ImageQualityStatus.FULL_RESOLUTION,\n pixelData: response,\n };\n }\n\n let { tokenIndex, responseHeaders, boundary, multipartContentType } = options;\n\n // First look for the multipart mime header\n tokenIndex ||= findIndexOfString(response, '\\r\\n\\r\\n');\n\n if (tokenIndex === -1) {\n throw new Error('invalid response - no multipart mime header');\n }\n\n if (!boundary) {\n const header = uint8ArrayToString(response, 0, tokenIndex);\n // Now find the boundary marker\n responseHeaders = header.split('\\r\\n');\n boundary = findBoundary(responseHeaders);\n\n if (!boundary) {\n throw new Error('invalid response - no boundary marker');\n }\n }\n const offset = tokenIndex + 4; // skip over the \\r\\n\\r\\n\n\n // find the terminal boundary marker\n const endIndex = findIndexOfString(response, boundary, offset);\n\n if (endIndex === -1 && !isPartial) {\n throw new Error('invalid response - terminating boundary not found');\n }\n\n multipartContentType ||= findContentType(responseHeaders);\n\n options.tokenIndex = tokenIndex;\n options.boundary = boundary;\n options.responseHeaders = responseHeaders;\n options.multipartContentType = multipartContentType;\n options.isPartial = endIndex === -1;\n\n // return the info for this pixel data\n return {\n contentType: multipartContentType,\n // done indicates if the read has finished the entire image, not if\n // the image is completely available\n extractDone: !isPartial || endIndex !== -1,\n tokenIndex,\n responseHeaders,\n boundary,\n multipartContentType,\n // Exclude the \\r\\n as well as the boundary\n pixelData: imageFrameAsArrayBuffer.slice(offset, endIndex - 2),\n };\n}\n\nexport function findBoundary(header: string[]): string {\n for (let i = 0; i < header.length; i++) {\n if (header[i].substr(0, 2) === '--') {\n return header[i];\n }\n }\n}\n\nexport function findContentType(header: string[]): string {\n for (let i = 0; i < header.length; i++) {\n if (header[i].substr(0, 13) === 'Content-Type:') {\n return header[i].substr(13).trim();\n }\n }\n}\n\nexport function uint8ArrayToString(data, offset, length) {\n offset = offset || 0;\n length = length || data.length - offset;\n let str = '';\n\n for (let i = offset; i < offset + length; i++) {\n str += String.fromCharCode(data[i]);\n }\n\n return str;\n}\n","import type { Types } from '@cornerstonejs/core';\nimport { Enums } from '@cornerstonejs/core';\n\nconst { ImageQualityStatus } = Enums;\n\n/** Gets the status of returned images */\nexport function getImageQualityStatus(\n retrieveOptions: Types.RetrieveOptions,\n done = true\n) {\n if (!done) {\n return ImageQualityStatus.SUBRESOLUTION;\n }\n return (\n retrieveOptions.imageQualityStatus ?? ImageQualityStatus.FULL_RESOLUTION\n );\n}\n","import type { Types } from '@cornerstonejs/core';\nimport { utilities } from '@cornerstonejs/core';\nimport { getOptions } from './options';\nimport type { LoaderXhrRequestError } from '../../types';\nimport extractMultipart from '../wadors/extractMultipart';\nimport { getImageQualityStatus } from '../wadors/getImageQualityStatus';\nimport type {\n CornerstoneWadoRsLoaderOptions,\n StreamingData,\n} from '../wadors/loadImage';\n\nconst { ProgressiveIterator } = utilities;\n\n/**\n * This function does a streaming parse from an http request, delivering\n * combined/subsequent parts of the result as iterations on a\n * ProgressiveIterator instance.\n *\n * @param url - to request and parse as either multipart or singlepart.\n * @param imageId - the imageId to be used in the returned detail object\n * @param defaultHeaders\n * @returns\n */\nexport default function streamRequest(\n url: string,\n imageId: string,\n defaultHeaders: Record<string, string> = {},\n options: CornerstoneWadoRsLoaderOptions = {}\n) {\n const globalOptions = getOptions();\n const {\n retrieveOptions = {} as Types.RangeRetrieveOptions,\n streamingData = {} as StreamingData,\n } = options;\n\n // @ts-expect-error\n const minChunkSize = retrieveOptions.minChunkSize || 128 * 1024;\n\n const errorInterceptor = (err) => {\n if (typeof globalOptions.errorInterceptor === 'function') {\n const error = new Error('request failed') as LoaderXhrRequestError;\n globalOptions.errorInterceptor(error);\n }\n };\n\n // Make the request for the streamable image frame (i.e. HTJ2K)\n const loadIterator = new ProgressiveIterator('streamRequest');\n loadIterator.generate(async (iterator, reject) => {\n const beforeSendHeaders = globalOptions.beforeSend?.(\n null,\n url,\n defaultHeaders,\n {}\n );\n const headers = Object.assign({}, defaultHeaders, beforeSendHeaders);\n\n Object.keys(headers).forEach(function (key) {\n if (headers[key] === null) {\n headers[key] = undefined;\n }\n if (key === 'Accept' && url.indexOf('accept=') !== -1) {\n headers[key] = undefined;\n }\n });\n\n try {\n const response = await fetch(url, {\n headers,\n signal: undefined,\n });\n\n // Response is expected to be a 200 status response\n if (response.status !== 200) {\n throw new Error(\n `Couldn't retrieve ${url} got status ${response.status}`\n );\n }\n const responseReader = response.body.getReader();\n const responseHeaders = response.headers;\n\n const contentType = responseHeaders.get('content-type');\n\n const totalBytes = Number(responseHeaders.get('Content-Length'));\n\n let readDone = false;\n let encodedData = streamingData.encodedData;\n // @ts-ignore\n let lastSize = streamingData.lastSize || 0;\n // @ts-ignore\n streamingData.isPartial = true;\n\n while (!readDone) {\n const { done, value } = await responseReader.read();\n encodedData = appendChunk(encodedData, value);\n if (!encodedData) {\n if (readDone) {\n throw new Error(`Done but no image frame available ${imageId}`);\n }\n continue;\n }\n readDone = done || encodedData.byteLength === totalBytes;\n if (!readDone && encodedData.length < lastSize + minChunkSize) {\n continue;\n }\n lastSize = encodedData.length;\n // @ts-ignore\n streamingData.isPartial = !done;\n const extracted = extractMultipart(\n contentType,\n encodedData,\n streamingData\n );\n const imageQualityStatus = getImageQualityStatus(\n retrieveOptions,\n readDone\n );\n const detail = {\n url,\n imageId,\n ...extracted,\n percentComplete: done\n ? 100\n : (extracted.pixelData?.length * 100) / totalBytes,\n imageQualityStatus,\n done: readDone,\n };\n\n // All of the image load events will be handled by the imageLoader\n // this simply delivers the raw data as it becomes available.\n iterator.add(detail, readDone);\n }\n } catch (err) {\n errorInterceptor(err);\n console.error(err);\n reject(err);\n }\n });\n\n return loadIterator.getNextPromise();\n}\n\nfunction appendChunk(existing: Uint8Array, chunk?: Uint8Array) {\n // that imageId\n if (!existing) {\n return chunk;\n }\n if (!chunk) {\n return existing;\n }\n const newDataArray = new Uint8Array(existing.length + chunk.length);\n newDataArray.set(existing, 0);\n newDataArray.set(chunk, existing.length);\n return newDataArray;\n}\n","import { default as xhrRequest } from './xhrRequest';\nimport { default as streamRequest } from './streamRequest';\nimport { setOptions, getOptions } from './options';\n\nconst internal = {\n xhrRequest,\n streamRequest,\n setOptions,\n getOptions,\n};\n\nexport { setOptions, getOptions, xhrRequest, internal, streamRequest };\n","import type { DataSet } from 'dicom-parser';\nimport * as dicomParser from 'dicom-parser';\nimport type {\n LoadRequestFunction,\n DICOMLoaderDataSetWithFetchMore,\n} from '../../types';\n\nfunction fixFragments(dataSet: DataSet) {\n // The partially parsed pixelData element has incorrect fragment\n // lengths because the byte array is truncated, so we manually set\n // it to the actual length.\n const fragments = dataSet.elements.x7fe00010.fragments;\n const totalLength = dataSet.byteArray.length;\n\n for (const fragment of fragments) {\n const { position, length } = fragment;\n\n if (length > totalLength - position) {\n console.log(\n `Truncated fragment, changing fragment length from ${\n fragment.length\n } to ${totalLength - position}`\n );\n fragment.length = totalLength - position;\n }\n }\n\n return dataSet;\n}\n\nfunction parsePartialByteArray(byteArray: Uint8Array) {\n /**\n * First parse just up to pixelData. This will make sure the\n * metadata header is correctly parsed (assuming no other error is\n * thrown during parsing). Then, parse again using the whole partial\n * arraybuffer. This will error, but still kick out the parsed\n * partial pixel data in the error object.\n */\n\n let dataSet = dicomParser.parseDicom(byteArray, {\n untilTag: 'x7fe00010',\n });\n\n if (!dataSet.elements.x7fe00010) {\n console.warn('Pixel data not found!');\n // Re-fetch more of the file\n }\n\n let pixelDataSet: DataSet;\n\n try {\n // This is expected to fail, since the file is incomplete, but\n // dicomParser helpfully spits out the parsed partial dataset in\n // the error object. The problem is, the dataset here is\n // incomplete, because dicomParser throws *before* combining the\n // metadata header and regular datasets, so transfer syntax and\n // other metadata headers aren't included.\n pixelDataSet = dicomParser.parseDicom(byteArray);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n // Todo: This is probably invalid handling - it expects the only reason to\n // fail is a partial dataset\n console.error(err);\n console.log('pixel data dataset:', err.dataSet);\n pixelDataSet = err.dataSet;\n }\n\n // Add the parsed partial pixel data element to the dataset\n // including the metadata headers.\n dataSet.elements.x7fe00010 = pixelDataSet.elements.x7fe00010;\n\n dataSet = fixFragments(dataSet);\n\n return dataSet;\n}\n\nexport default async function dataSetFromPartialContent(\n byteArray: Uint8Array,\n loadRequest: LoadRequestFunction,\n metadata: {\n uri: string;\n imageId: string;\n fileTotalLength: number | null;\n }\n): Promise<DICOMLoaderDataSetWithFetchMore> {\n const dataSet: DICOMLoaderDataSetWithFetchMore =\n parsePartialByteArray(byteArray);\n const { uri, imageId, fileTotalLength } = metadata;\n\n // Allow re-fetching of more of the file\n dataSet.fetchMore = async function (fetchOptions) {\n // Default to fetching the rest of the file if no lengthToFetch is set. Also\n // default to fetching the same URI/imageId\n const _options = Object.assign(\n {\n uri,\n imageId,\n fetchedLength: byteArray.length, // Not sure if this would ever need to be configurable tbh\n lengthToFetch: fileTotalLength - byteArray.length,\n },\n fetchOptions\n );\n const { fetchedLength, lengthToFetch } = _options;\n\n // Use passed xhr loader to re-fetch new byte range\n\n // Todo: the following might be wrong, does it return array buffer or\n // something else?\n // @ts-ignore\n const { arrayBuffer } = await loadRequest(uri, imageId, {\n byteRange: `${fetchedLength}-${fetchedLength + lengthToFetch}`,\n });\n\n // Combine byte ranges\n const byteArrayToAppend = new Uint8Array(arrayBuffer);\n const combinedByteArray = new Uint8Array(\n dataSet.byteArray.length + byteArrayToAppend.length\n );\n\n combinedByteArray.set(dataSet.byteArray);\n combinedByteArray.set(byteArrayToAppend, dataSet.byteArray.length);\n\n // Re-parse potentially partial byte range and return\n return dataSetFromPartialContent(combinedByteArray, loadRequest, metadata);\n };\n\n return dataSet;\n}\n","function getDirectFrameInformation(dataSet, frame) {\n if (!dataSet) {\n return;\n }\n\n const {\n NumberOfFrames,\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n } = getMultiframeInformation(dataSet);\n\n if (PerFrameFunctionalGroupsSequence || NumberOfFrames > 1) {\n const { shared, perFrame } = getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frame\n );\n\n return {\n NumberOfFrames,\n PerFrameFunctionalInformation: perFrame,\n SharedFunctionalInformation: shared,\n };\n }\n\n return {\n NumberOfFrames,\n };\n}\n\nfunction getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frameNumber\n) {\n const shared = {};\n\n (SharedFunctionalGroupsSequence\n ? Object.values(SharedFunctionalGroupsSequence.items[0].dataSet.elements)\n : []\n )\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((it: any) => (shared[it.tag] = it));\n\n const perFrame = {};\n\n (PerFrameFunctionalGroupsSequence\n ? Object.values(\n PerFrameFunctionalGroupsSequence.items[frameNumber - 1].dataSet.elements\n )\n : []\n )\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((it: any) => (perFrame[it.tag] = it));\n\n return {\n shared,\n perFrame,\n };\n}\n\nfunction getMultiframeInformation(dataSet) {\n if (!dataSet) {\n return;\n }\n const { elements, ...otherAttributtes } = dataSet;\n const {\n x52009230: PerFrameFunctionalGroupsSequence,\n x52009229: SharedFunctionalGroupsSequence,\n ...otherElements\n } = elements;\n\n const NumberOfFrames = dataSet.intString('x00280008');\n\n return {\n NumberOfFrames,\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n otherElements,\n otherAttributtes,\n };\n}\n\n// function that retrieves specific frame metadata information from multiframe\n// metadata\nfunction combineFrameInstanceDataset(frameNumber, dataSet) {\n if (!dataSet) {\n return;\n }\n\n const {\n NumberOfFrames,\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n otherElements,\n } = getMultiframeInformation(dataSet);\n\n if (PerFrameFunctionalGroupsSequence || NumberOfFrames > 1) {\n const { shared, perFrame } = getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frameNumber\n );\n\n // creating a new copy of the dataset to remove the two multiframe dicom tags\n const newElements = {\n elements: {\n ...otherElements,\n ...shared,\n ...perFrame,\n },\n };\n\n const clonedDataset = Object.create(dataSet);\n const newDataset = Object.assign(clonedDataset, newElements);\n\n return newDataset;\n }\n\n return dataSet;\n}\n\nexport {\n combineFrameInstanceDataset,\n getMultiframeInformation,\n getFrameInformation,\n getDirectFrameInformation,\n};\n","import type { DataSet } from 'dicom-parser';\n\nlet loadedDataSets: Record<string, { dataSet: DataSet; cacheCount: number }> =\n {};\n\nconst purgeLoadedDataSets = () => {\n loadedDataSets = {};\n};\nexport { loadedDataSets, purgeLoadedDataSets };\n","import { loadedDataSets } from './loadedDataSets';\n\nfunction _get(uri) {\n if (!loadedDataSets[uri]) {\n return;\n }\n\n return loadedDataSets[uri];\n}\n\nfunction isMultiframeDataset(uri) {\n const dataSet = _get(uri);\n\n return _isMultiframeDataset(dataSet);\n}\n\nfunction _isMultiframeDataset(dataSet) {\n // Checks if dicomTag NumberOf Frames exists and it is greater than one\n if (!dataSet) {\n return false;\n }\n\n const numberOfFrames = dataSet.intString('x00280008');\n\n return numberOfFrames && numberOfFrames > 1;\n}\n\nfunction retrieveFrameParameterIndex(uri) {\n return uri.indexOf('&frame=');\n}\n\nfunction retrieveMultiframeDataset(uri) {\n const frameParameterIndex = retrieveFrameParameterIndex(uri);\n const multiframeURI =\n frameParameterIndex === -1 ? uri : uri.slice(0, frameParameterIndex);\n const frame = parseInt(uri.slice(frameParameterIndex + 7), 10) || 1;\n\n let dataSet;\n\n if (loadedDataSets[multiframeURI]) {\n dataSet = loadedDataSets[multiframeURI].dataSet;\n } else {\n dataSet = undefined;\n }\n\n return {\n dataSet,\n frame,\n };\n}\n\nfunction generateMultiframeWADOURIs(uri) {\n const listWADOURIs = [];\n\n const dataSet = _get(uri);\n\n if (_isMultiframeDataset(dataSet)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const numberOfFrames = (dataSet as any).intString('x00280008');\n\n for (let i = 1; i <= numberOfFrames; i++) {\n listWADOURIs.push(`${uri}&frame=${i}`);\n }\n } else {\n listWADOURIs.push(uri);\n }\n\n return listWADOURIs;\n}\n\nexport default {\n _get,\n generateMultiframeWADOURIs,\n retrieveMultiframeDataset,\n isMultiframeDataset,\n};\n","import type { DataSet } from 'dicom-parser';\nimport * as dicomParser from 'dicom-parser';\nimport { xhrRequest } from '../internal/index';\nimport dataSetFromPartialContent from './dataset-from-partial-content';\nimport type {\n LoadRequestFunction,\n DICOMLoaderDataSetWithFetchMore,\n} from '../../types';\nimport { combineFrameInstanceDataset } from './combineFrameInstanceDataset';\nimport multiframeDataset from './retrieveMultiframeDataset';\nimport { loadedDataSets, purgeLoadedDataSets } from './loadedDataSets';\nimport { eventTarget, triggerEvent } from '@cornerstonejs/core';\n\nexport interface CornerstoneWadoLoaderCacheManagerInfoResponse {\n cacheSizeInBytes: number;\n numberOfDataSetsCached: number;\n}\n\nexport interface CornerstoneWadoLoaderCachedPromise\n extends Promise<DataSet | DICOMLoaderDataSetWithFetchMore> {\n cacheCount?: number;\n}\n\n/**\n * This object supports loading of DICOM P10 dataset from a uri and caching it so it can be accessed\n * by the caller. This allows a caller to access the datasets without having to go through cornerstone's\n * image loader mechanism. One reason a caller may need to do this is to determine the number of frames\n * in a multiframe sop instance so it can create the imageId's correctly.\n */\nlet cacheSizeInBytes = 0;\n\nlet promises: Record<string, CornerstoneWadoLoaderCachedPromise> = {};\n\n// returns true if the wadouri for the specified index has been loaded\nfunction isLoaded(uri: string): boolean {\n return loadedDataSets[uri] !== undefined;\n}\n\nfunction get(uri: string): DataSet {\n let dataSet;\n\n if (uri.includes('&frame=')) {\n const { frame, dataSet: multiframeDataSet } =\n multiframeDataset.retrieveMultiframeDataset(uri);\n\n dataSet = combineFrameInstanceDataset(frame, multiframeDataSet);\n } else if (loadedDataSets[uri]) {\n dataSet = loadedDataSets[uri].dataSet;\n }\n\n return dataSet;\n}\n\nfunction update(uri: string, dataSet: DataSet) {\n const loadedDataSet = loadedDataSets[uri];\n\n if (!loadedDataSet) {\n console.error(`No loaded dataSet for uri ${uri}`);\n\n return;\n }\n // Update dataset\n cacheSizeInBytes -= loadedDataSet.dataSet.byteArray.length;\n loadedDataSet.dataSet = dataSet;\n cacheSizeInBytes += dataSet.byteArray.length;\n\n triggerEvent(eventTarget, 'datasetscachechanged', {\n uri,\n action: 'updated',\n cacheInfo: getInfo(),\n });\n}\n\n// loads the dicom dataset from the wadouri sp\nfunction load(\n uri: string,\n loadRequest: LoadRequestFunction = xhrRequest as LoadRequestFunction,\n imageId: string\n): CornerstoneWadoLoaderCachedPromise {\n // if already loaded return it right away\n if (loadedDataSets[uri]) {\n // console.log('using loaded dataset ' + uri);\n return new Promise((resolve) => {\n loadedDataSets[uri].cacheCount++;\n resolve(loadedDataSets[uri].dataSet);\n });\n }\n\n // if we are currently loading this uri, increment the cacheCount and return its promise\n if (promises[uri]) {\n // console.log('returning existing load promise for ' + uri);\n promises[uri].cacheCount++;\n\n return promises[uri];\n }\n\n // This uri is not loaded or being loaded, load it via an xhrRequest\n const loadDICOMPromise = loadRequest(uri, imageId);\n\n // handle success and failure of the XHR request load\n const promise: CornerstoneWadoLoaderCachedPromise = new Promise(\n (resolve, reject) => {\n loadDICOMPromise\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .then(async function (dicomPart10AsArrayBuffer: any /* , xhr*/) {\n const partialContent = {\n isPartialContent: false,\n fileTotalLength: null,\n };\n\n // Allow passing extra data with the loader promise so as not to change\n // the API\n if (!(dicomPart10AsArrayBuffer instanceof ArrayBuffer)) {\n if (!dicomPart10AsArrayBuffer.arrayBuffer) {\n return reject(\n new Error(\n 'If not returning ArrayBuffer, must return object with `arrayBuffer` parameter'\n )\n );\n }\n partialContent.isPartialContent =\n dicomPart10AsArrayBuffer.flags.isPartialContent;\n partialContent.fileTotalLength =\n dicomPart10AsArrayBuffer.flags.fileTotalLength;\n dicomPart10AsArrayBuffer = dicomPart10AsArrayBuffer.arrayBuffer;\n }\n\n const byteArray = new Uint8Array(dicomPart10AsArrayBuffer);\n\n // Reject the promise if parsing the dicom file fails\n let dataSet: DataSet | DICOMLoaderDataSetWithFetchMore;\n\n try {\n if (partialContent.isPartialContent) {\n // This dataSet object will include a fetchMore function,\n dataSet = await dataSetFromPartialContent(\n byteArray,\n loadRequest,\n {\n uri,\n imageId,\n fileTotalLength: partialContent.fileTotalLength,\n }\n );\n } else {\n dataSet = dicomParser.parseDicom(byteArray);\n }\n } catch (error) {\n return reject(error);\n }\n\n loadedDataSets[uri] = {\n dataSet,\n cacheCount: promise.cacheCount,\n };\n cacheSizeInBytes += dataSet.byteArray.length;\n resolve(dataSet);\n\n triggerEvent(eventTarget, 'datasetscachechanged', {\n uri,\n action: 'loaded',\n cacheInfo: getInfo(),\n });\n }, reject)\n .then(\n () => {\n // Remove the promise if success\n delete promises[uri];\n },\n () => {\n // Remove the promise if failure\n delete promises[uri];\n }\n );\n }\n );\n\n promise.cacheCount = 1;\n\n promises[uri] = promise;\n\n return promise;\n}\n\n// remove the cached/loaded dicom dataset for the specified wadouri to free up memory\nfunction unload(uri: string): void {\n // console.log('unload for ' + uri);\n if (loadedDataSets[uri]) {\n loadedDataSets[uri].cacheCount--;\n if (loadedDataSets[uri].cacheCount === 0) {\n // console.log('removing loaded dataset for ' + uri);\n cacheSizeInBytes -= loadedDataSets[uri].dataSet.byteArray.length;\n delete loadedDataSets[uri];\n\n triggerEvent(eventTarget, 'datasetscachechanged', {\n uri,\n action: 'unloaded',\n cacheInfo: getInfo(),\n });\n }\n }\n}\n\nexport function getInfo(): CornerstoneWadoLoaderCacheManagerInfoResponse {\n return {\n cacheSizeInBytes,\n numberOfDataSetsCached: Object.keys(loadedDataSets).length,\n };\n}\n\n// removes all cached datasets from memory\nfunction purge(): void {\n purgeLoadedDataSets();\n promises = {};\n cacheSizeInBytes = 0;\n}\n\nexport default {\n isLoaded,\n load,\n unload,\n getInfo,\n purge,\n get,\n update,\n};\n\nexport { loadedDataSets };\n","export default function isNMReconstructable(imageSubType) {\n return imageSubType === 'RECON TOMO' || imageSubType === 'RECON GATED TOMO';\n}\n","import getNumberValues from './getNumberValues';\nimport isNMReconstructable from '../../isNMReconstructable';\n\n/**\n * Get a subpart of Image Type dicom tag defined by index\n * @param {*} dataSet\n * @param {*} index 0 based index of the subtype\n */\nfunction getImageTypeSubItemFromDataset(dataSet, index) {\n const imageType = dataSet.string('x00080008');\n\n if (imageType) {\n const subTypes = imageType.split('\\\\');\n\n if (subTypes.length > index) {\n return subTypes[index];\n }\n }\n\n return undefined;\n}\n/**\n * Extracts the orientation from NM multiframe dataset, if image type\n * equal to RECON TOMO or RECON GATED TOMO\n * @param {*} dataSet\n * @returns\n */\nfunction extractOrientationFromNMMultiframeDataset(dataSet) {\n let imageOrientationPatient;\n const modality = dataSet.string('x00080060');\n\n if (modality?.includes('NM')) {\n const imageSubType = getImageTypeSubItemFromDataset(dataSet, 2);\n\n if (imageSubType && isNMReconstructable(imageSubType)) {\n if (dataSet.elements.x00540022) {\n imageOrientationPatient = getNumberValues(\n dataSet.elements.x00540022.items[0].dataSet,\n 'x00200037',\n 6\n );\n }\n }\n }\n\n return imageOrientationPatient;\n}\n\n/**\n * Extracts the position from NM multiframe dataset, if image type\n * equal to RECON TOMO or RECON GATED TOMO\n * @param {*} dataSet\n * @returns\n */\nfunction extractPositionFromNMMultiframeDataset(dataSet) {\n let imagePositionPatient;\n const modality = dataSet.string('x00080060');\n\n if (modality?.includes('NM')) {\n const imageSubType = getImageTypeSubItemFromDataset(dataSet, 2);\n\n if (imageSubType && isNMReconstructable(imageSubType)) {\n if (dataSet.elements.x00540022) {\n imagePositionPatient = getNumberValues(\n dataSet.elements.x00540022.items[0].dataSet,\n 'x00200032',\n 3\n );\n }\n }\n }\n\n return imagePositionPatient;\n}\n\n/**\n * Extract orientation information from a dataset. It tries to get the orientation\n * from the Detector Information Sequence (for NM images) if image type equal\n * to RECON TOMO or RECON GATED TOMO\n * @param {*} dataSet\n * @returns\n */\nfunction extractOrientationFromDataset(dataSet) {\n let imageOrientationPatient = getNumberValues(dataSet, 'x00200037', 6);\n\n // Trying to get the orientation from the Plane Orientation Sequence\n if (!imageOrientationPatient && dataSet.elements.x00209116) {\n imageOrientationPatient = getNumberValues(\n dataSet.elements.x00209116.items[0].dataSet,\n 'x00200037',\n 6\n );\n }\n\n // If orientation not valid to this point, trying to get the orientation\n // from the Detector Information Sequence (for NM images) with image type\n // equal to RECON TOMO or RECON GATED TOMO\n\n if (!imageOrientationPatient) {\n imageOrientationPatient =\n extractOrientationFromNMMultiframeDataset(dataSet);\n }\n\n return imageOrientationPatient;\n}\n\n/**\n * Extract position information from a dataset. It tries to get the position\n * from the Detector Information Sequence (for NM images) if image type equal\n * to RECON TOMO or RECON GATED TOMO\n * @param {*} dataSet\n * @returns\n */\nfunction extractPositionFromDataset(dataSet) {\n let imagePositionPatient = getNumberValues(dataSet, 'x00200032', 3);\n\n // Trying to get the position from the Plane Position Sequence\n if (!imagePositionPatient && dataSet.elements.x00209113) {\n imagePositionPatient = getNumberValues(\n dataSet.elements.x00209113.items[0].dataSet,\n 'x00200032',\n 3\n );\n }\n\n // If position not valid to this point, trying to get the position\n // from the Detector Information Sequence (for NM images)\n if (!imagePositionPatient) {\n imagePositionPatient = extractPositionFromNMMultiframeDataset(dataSet);\n }\n\n return imagePositionPatient;\n}\n\n/**\n * Extract the pixelSpacing information. If exists, extracts this information\n * from Pixel Measures Sequence\n * @param {*} dataSet\n * @returns\n */\nfunction extractSpacingFromDataset(dataSet) {\n let pixelSpacing = getNumberValues(dataSet, 'x00280030', 2);\n\n // If pixelSpacing not valid to this point, trying to get the spacing\n // from the Pixel Measures Sequence\n if (!pixelSpacing && dataSet.elements.x00289110) {\n pixelSpacing = getNumberValues(\n dataSet.elements.x00289110.items[0].dataSet,\n 'x00280030',\n 2\n );\n }\n\n return pixelSpacing;\n}\n\n/**\n * Extract the sliceThickness information. If exists, extracts this information\n * from Pixel Measures Sequence\n * @param {*} dataSet\n * @returns\n */\nfunction extractSliceThicknessFromDataset(dataSet) {\n let sliceThickness;\n\n if (dataSet.elements.x00180050) {\n sliceThickness = dataSet.floatString('x00180050');\n } else if (\n dataSet.elements.x00289110 &&\n dataSet.elements.x00289110.items.length &&\n dataSet.elements.x00289110.items[0].dataSet.elements.x00180050\n ) {\n sliceThickness =\n dataSet.elements.x00289110.items[0].dataSet.floatString('x00180050');\n }\n\n return sliceThickness;\n}\n\nexport {\n getImageTypeSubItemFromDataset,\n extractOrientationFromDataset,\n extractPositionFromDataset,\n extractSpacingFromDataset,\n extractSliceThicknessFromDataset,\n};\n","/**\n * Retrieves metadata from a DICOM image and returns it as an object with capitalized keys.\n * @param imageId - the imageId\n * @param metaDataProvider - The metadata provider either wadors or wadouri\n * @param types - An array of metadata types to retrieve.\n * @returns An object containing the retrieved metadata with capitalized keys.\n */\nfunction getInstanceModule(imageId, metaDataProvider, types) {\n const result = {};\n for (const t of types) {\n try {\n const data = metaDataProvider(t, imageId);\n if (data) {\n const capitalizedData = {};\n for (const key in data) {\n if (key in data) {\n // each tag should get capitalized to match dcmjs style. Todo: move all of the tags to dcmjs style\n const capitalizedKey = capitalizeTag(key);\n capitalizedData[capitalizedKey] = data[key];\n }\n }\n Object.assign(result, capitalizedData);\n }\n } catch (error) {\n console.error(`Error retrieving ${t} data:`, error);\n }\n }\n\n return result;\n}\n\nconst capitalizeTag = (tag: string) =>\n tag.charAt(0).toUpperCase() + tag.slice(1);\n\nconst instanceModuleNames = [\n 'multiframeModule',\n 'generalSeriesModule',\n 'patientStudyModule',\n 'imagePlaneModule',\n 'nmMultiframeGeometryModule',\n 'imagePixelModule',\n 'modalityLutModule',\n 'voiLutModule',\n 'sopCommonModule',\n 'petIsotopeModule',\n 'overlayPlaneModule',\n 'transferSyntax',\n 'petSeriesModule',\n 'petImageModule',\n];\n\nexport { getInstanceModule, instanceModuleNames };\n","/**\n * This function retrieves the ultrasound regions from the provided metadata.\n * @param metadata - The metadata from which to retrieve the ultrasound regions.\n * @returns An array of ultrasound regions, or null if no regions are found.\n */\n\nfunction getUSEnhancedRegions(metadata) {\n const sequence = metadata.elements['x00186011'];\n if (!sequence || !sequence.items) {\n return [];\n }\n\n const regions = sequence.items.map((item) => {\n const physicalDeltaX = item.dataSet.double('x0018602c');\n const physicalDeltaY = item.dataSet.double('x0018602e');\n const physicalUnitsXDirection = item.dataSet.uint16('x00186024');\n const physicalUnitsYDirection = item.dataSet.uint16('x00186026');\n\n const regionLocationMinY0 = item.dataSet.uint16('x0018601a');\n const regionLocationMaxY1 = item.dataSet.uint16('x0018601e');\n const regionLocationMinX0 = item.dataSet.uint16('x00186018');\n const regionLocationMaxX1 = item.dataSet.uint16('x0018601c');\n const referencePixelX0 = item.dataSet.int32('x00186020') || null;\n const referencePixelY0 = item.dataSet.int32('x00186022') || null;\n\n const referencePhysicalPixelValueY = item.dataSet.uint16('x0018602a');\n const referencePhysicalPixelValueX = item.dataSet.uint16('x00186028');\n const regionSpatialFormat = item.dataSet.uint16('x00186012');\n\n const regionDataType = item.dataSet.uint16('x00186014');\n const regionFlags = item.dataSet.uint16('x00186016');\n const transducerFrequency = item.dataSet.uint16('x00186030');\n return {\n regionLocationMinY0,\n regionLocationMaxY1,\n regionLocationMinX0,\n regionLocationMaxX1,\n referencePixelX0,\n referencePixelY0,\n physicalDeltaX,\n physicalDeltaY,\n physicalUnitsXDirection,\n physicalUnitsYDirection,\n referencePhysicalPixelValueY,\n referencePhysicalPixelValueX,\n regionSpatialFormat,\n regionDataType,\n regionFlags,\n transducerFrequency,\n };\n });\n\n return regions;\n}\n\nexport { getUSEnhancedRegions };\n","import { Enums } from '@cornerstonejs/core';\nimport * as dicomParser from 'dicom-parser';\nimport getNumberValues from './getNumberValues';\nimport parseImageId from '../parseImageId';\nimport dataSetCacheManager from '../dataSetCacheManager';\nimport getImagePixelModule from './getImagePixelModule';\nimport getOverlayPlaneModule from './getOverlayPlaneModule';\nimport getLUTs from './getLUTs';\nimport getModalityLUTOutputPixelRepresentation from './getModalityLUTOutputPixelRepresentation';\nimport { getDirectFrameInformation } from '../combineFrameInstanceDataset';\nimport multiframeDataset from '../retrieveMultiframeDataset';\nimport {\n getImageTypeSubItemFromDataset,\n extractOrientationFromDataset,\n extractPositionFromDataset,\n extractSpacingFromDataset,\n extractSliceThicknessFromDataset,\n} from './extractPositioningFromDataset';\nimport isNMReconstructable from '../../isNMReconstructable';\nimport {\n getInstanceModule,\n instanceModuleNames,\n} from '../../getInstanceModule';\nimport { getUSEnhancedRegions } from './USHelpers';\n\nfunction metaDataProvider(type, imageId) {\n const { MetadataModules } = Enums;\n\n // Several providers use array queries\n if (Array.isArray(imageId)) {\n return;\n }\n\n const parsedImageId = parseImageId(imageId);\n\n if (type === MetadataModules.MULTIFRAME) {\n const multiframeData = multiframeDataset.retrieveMultiframeDataset(\n parsedImageId.url\n );\n\n if (!multiframeData.dataSet) {\n return;\n }\n\n const multiframeInfo = getDirectFrameInformation(\n multiframeData.dataSet,\n multiframeData.frame\n );\n\n return multiframeInfo;\n }\n\n let url = parsedImageId.url;\n\n if (parsedImageId.frame) {\n url = `${url}&frame=${parsedImageId.frame}`;\n }\n\n const dataSet = dataSetCacheManager.get(url);\n\n if (!dataSet) {\n return;\n }\n\n return metadataForDataset(type, imageId, dataSet);\n}\n\nexport function metadataForDataset(\n type,\n imageId,\n dataSet: dicomParser.DataSet\n) {\n const { MetadataModules } = Enums;\n\n if (type === MetadataModules.GENERAL_STUDY) {\n return {\n studyDescription: dataSet.string('x00081030'),\n studyDate: dicomParser.parseDA(dataSet.string('x00080020')),\n studyTime: dicomParser.parseTM(dataSet.string('x00080030') || ''),\n accessionNumber: dataSet.string('x00080050'),\n };\n }\n\n if (type === MetadataModules.GENERAL_SERIES) {\n return {\n modality: dataSet.string('x00080060'),\n seriesInstanceUID: dataSet.string('x0020000e'),\n seriesNumber: dataSet.intString('x00200011'),\n studyInstanceUID: dataSet.string('x0020000d'),\n seriesDate: dicomParser.parseDA(dataSet.string('x00080021')),\n seriesTime: dicomParser.parseTM(dataSet.string('x00080031') || ''),\n acquisitionDate: dicomParser.parseDA(dataSet.string('x00080022')),\n acquisitionTime: dicomParser.parseTM(dataSet.string('x00080032') || ''),\n };\n }\n\n if (type === MetadataModules.GENERAL_IMAGE) {\n return {\n sopInstanceUID: dataSet.string('x00080018'),\n instanceNumber: dataSet.intString('x00200013'),\n lossyImageCompression: dataSet.string('x00282110'),\n lossyImageCompressionRatio: dataSet.floatString('x00282112'),\n lossyImageCompressionMethod: dataSet.string('x00282114'),\n };\n }\n\n if (type === MetadataModules.PATIENT) {\n return {\n patientID: dataSet.string('x00100020'),\n patientName: dataSet.string('x00100010'),\n };\n }\n\n if (type === MetadataModules.PATIENT_STUDY) {\n return {\n patientAge: dataSet.intString('x00101010'),\n patientSize: dataSet.floatString('x00101020'),\n patientSex: dataSet.string('x00100040'),\n patientWeight: dataSet.floatString('x00101030'),\n };\n }\n\n if (type === MetadataModules.NM_MULTIFRAME_GEOMETRY) {\n const modality = dataSet.string('x00080060');\n const imageSubType = getImageTypeSubItemFromDataset(dataSet, 2);\n\n return {\n modality,\n imageType: dataSet.string('x00080008'),\n imageSubType,\n imageOrientationPatient: extractOrientationFromDataset(dataSet),\n imagePositionPatient: extractPositionFromDataset(dataSet),\n sliceThickness: extractSliceThicknessFromDataset(dataSet),\n pixelSpacing: extractSpacingFromDataset(dataSet),\n numberOfFrames: dataSet.uint16('x00280008'),\n isNMReconstructable:\n isNMReconstructable(imageSubType) && modality.includes('NM'),\n };\n }\n\n if (type === MetadataModules.IMAGE_PLANE) {\n const imageOrientationPatient = extractOrientationFromDataset(dataSet);\n const imagePositionPatient = extractPositionFromDataset(dataSet);\n const pixelSpacing = extractSpacingFromDataset(dataSet);\n const sliceThickness = extractSliceThicknessFromDataset(dataSet);\n\n let columnPixelSpacing = null;\n\n let rowPixelSpacing = null;\n\n if (pixelSpacing) {\n rowPixelSpacing = pixelSpacing[0];\n columnPixelSpacing = pixelSpacing[1];\n }\n\n let rowCosines = null;\n\n let columnCosines = null;\n\n if (imageOrientationPatient) {\n rowCosines = [\n // @ts-expect-error\n parseFloat(imageOrientationPatient[0]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[1]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[2]),\n ];\n columnCosines = [\n // @ts-expect-error\n parseFloat(imageOrientationPatient[3]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[4]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[5]),\n ];\n }\n\n return {\n frameOfReferenceUID: dataSet.string('x00200052'),\n rows: dataSet.uint16('x00280010'),\n columns: dataSet.uint16('x00280011'),\n imageOrientationPatient,\n rowCosines,\n columnCosines,\n imagePositionPatient,\n sliceThickness,\n sliceLocation: dataSet.floatString('x00201041'),\n pixelSpacing,\n rowPixelSpacing,\n columnPixelSpacing,\n };\n }\n\n if (type === MetadataModules.CINE) {\n return {\n frameTime: dataSet.floatString('x00181063'),\n };\n }\n\n if (type === MetadataModules.IMAGE_PIXEL) {\n return getImagePixelModule(dataSet);\n }\n\n if (type === MetadataModules.VOI_LUT) {\n const modalityLUTOutputPixelRepresentation =\n getModalityLUTOutputPixelRepresentation(dataSet);\n\n return {\n windowCenter: getNumberValues(dataSet, 'x00281050', 1),\n windowWidth: getNumberValues(dataSet, 'x00281051', 1),\n voiLUTSequence: getLUTs(\n modalityLUTOutputPixelRepresentation,\n dataSet.elements.x00283010\n ),\n };\n }\n\n if (type === MetadataModules.MODALITY_LUT) {\n return {\n rescaleIntercept: dataSet.floatString('x00281052'),\n rescaleSlope: dataSet.floatString('x00281053'),\n rescaleType: dataSet.string('x00281054'),\n modalityLUTSequence: getLUTs(\n dataSet.uint16('x00280103'),\n dataSet.elements.x00283000\n ),\n };\n }\n\n if (type === MetadataModules.SOP_COMMON) {\n return {\n sopClassUID: dataSet.string('x00080016'),\n sopInstanceUID: dataSet.string('x00080018'),\n };\n }\n\n if (type === MetadataModules.PET_ISOTOPE) {\n const radiopharmaceuticalInfo = dataSet.elements.x00540016;\n\n if (radiopharmaceuticalInfo === undefined) {\n return;\n }\n\n const firstRadiopharmaceuticalInfoDataSet =\n radiopharmaceuticalInfo.items[0].dataSet;\n\n return {\n radiopharmaceuticalInfo: {\n radiopharmaceuticalStartTime: dicomParser.parseTM(\n firstRadiopharmaceuticalInfoDataSet.string('x00181072') || ''\n ),\n radionuclideTotalDose:\n firstRadiopharmaceuticalInfoDataSet.floatString('x00181074'),\n radionuclideHalfLife:\n firstRadiopharmaceuticalInfoDataSet.floatString('x00181075'),\n },\n };\n }\n\n if (type === MetadataModules.OVERLAY_PLANE) {\n return getOverlayPlaneModule(dataSet);\n }\n\n // Note: this is not a DICOM module, but a useful metadata that can be\n // retrieved from the image\n if (type === 'transferSyntax') {\n let transferSyntaxUID;\n\n try {\n transferSyntaxUID = dataSet.string('x00020010');\n } catch (error) {\n // Do nothing\n }\n\n return {\n transferSyntaxUID,\n };\n }\n\n if (type === MetadataModules.PET_SERIES) {\n return {\n correctedImage: dataSet.string('x00280051'),\n units: dataSet.string('x00541001'),\n decayCorrection: dataSet.string('x00541102'),\n };\n }\n\n if (type === MetadataModules.PET_IMAGE) {\n return {\n frameReferenceTime: dataSet.floatString(\n dataSet.string('x00541300') || ''\n ),\n actualFrameDuration: dataSet.intString(dataSet.string('x00181242')),\n };\n }\n\n if (type === MetadataModules.ULTRASOUND_ENHANCED_REGION) {\n return getUSEnhancedRegions(dataSet);\n }\n\n if (type === MetadataModules.CALIBRATION) {\n const modality = dataSet.string('x00080060');\n if (modality === 'US') {\n const enhancedRegion = getUSEnhancedRegions(dataSet);\n return {\n sequenceOfUltrasoundRegions: enhancedRegion,\n };\n }\n }\n\n // Note: this is not a DICOM module, but rather an aggregation on all others\n if (type === 'instance') {\n return getInstanceModule(imageId, metaDataProvider, instanceModuleNames);\n }\n}\n\nexport default metaDataProvider;\n","import type { DataSet } from 'dicom-parser';\n\nexport default function getOverlayPlaneModule(dataSet: DataSet) {\n const overlays = [];\n\n for (let overlayGroup = 0x00; overlayGroup <= 0x1e; overlayGroup += 0x02) {\n let groupStr = `x60${overlayGroup.toString(16)}`;\n\n if (groupStr.length === 4) {\n groupStr = `x600${overlayGroup.toString(16)}`;\n }\n\n const data = dataSet.elements[`${groupStr}3000`];\n\n if (!data) {\n continue;\n }\n\n const pixelData = [];\n\n for (let i = 0; i < data.length; i++) {\n for (let k = 0; k < 8; k++) {\n const byte_as_int = dataSet.byteArray[data.dataOffset + i];\n\n pixelData[i * 8 + k] = (byte_as_int >> k) & 0b1; // eslint-disable-line no-bitwise\n }\n }\n\n overlays.push({\n rows: dataSet.uint16(`${groupStr}0010`),\n columns: dataSet.uint16(`${groupStr}0011`),\n type: dataSet.string(`${groupStr}0040`),\n x: dataSet.int16(`${groupStr}0050`, 1) - 1,\n y: dataSet.int16(`${groupStr}0050`, 0) - 1,\n pixelData,\n description: dataSet.string(`${groupStr}0022`),\n label: dataSet.string(`${groupStr}1500`),\n roiArea: dataSet.string(`${groupStr}1301`),\n roiMean: dataSet.string(`${groupStr}1302`),\n roiStandardDeviation: dataSet.string(`${groupStr}1303`),\n });\n }\n\n return {\n overlays,\n };\n}\n","let files: Blob[] = [];\n\nfunction add(file: Blob): string {\n const fileIndex = files.push(file);\n\n return `dicomfile:${fileIndex - 1}`;\n}\n\nfunction get(index: number): Blob {\n return files[index];\n}\n\nfunction remove(index: number): void {\n files[index] = undefined;\n}\n\nfunction purge(): void {\n files = [];\n}\n\nexport default {\n add,\n get,\n remove,\n purge,\n};\n","import type { ByteArray, DataSet } from 'dicom-parser';\nimport {\n ByteStream,\n createJPEGBasicOffsetTable,\n readEncapsulatedImageFrame,\n readSequenceItem,\n} from 'dicom-parser';\n/**\n * Function to deal with extracting an image frame from an encapsulated data set.\n */\n\nfunction framesAreFragmented(dataSet: DataSet) {\n const numberOfFrames = dataSet.intString('x00280008');\n const pixelDataElement = dataSet.elements.x7fe00010;\n\n return numberOfFrames !== pixelDataElement.fragments.length;\n}\n\nexport default function getEncapsulatedImageFrame(\n dataSet: DataSet,\n frameIndex: number\n): ByteArray {\n if (\n dataSet.elements.x7fe00010 &&\n dataSet.elements.x7fe00010.basicOffsetTable.length\n ) {\n // Basic Offset Table is not empty\n return readEncapsulatedImageFrame(\n dataSet,\n dataSet.elements.x7fe00010,\n frameIndex\n );\n }\n\n // Empty basic offset table\n\n if (framesAreFragmented(dataSet)) {\n const basicOffsetTable = createJPEGBasicOffsetTable(\n dataSet,\n dataSet.elements.x7fe00010\n );\n\n return readEncapsulatedImageFrame(\n dataSet,\n dataSet.elements.x7fe00010,\n frameIndex,\n basicOffsetTable\n );\n }\n\n // the following code is pretty much a duplicate of the logic here\n // https://github.com/cornerstonejs/dicomParser/blob/master/src/readEncapsulatedPixelDataFromFragments.js\n // but it takes care of slicing the array buffer to be sent to the worker. We can't\n // get a view of the buffer because the buffer since it will still have the\n // array buffer, which can be in some cases huge to be sent to the worker.\n // Todo: a better approach would be to transfer the buffer to the worker by having the\n // transferPixelData option set to true, but for some reason it is giving an error\n // in the dicomParser library.\n const fragments = dataSet.elements.x7fe00010.fragments;\n\n // create byte stream on the data for this pixel data element\n const byteStream = new ByteStream(\n dataSet.byteArrayParser,\n dataSet.byteArray,\n dataSet.elements.x7fe00010.dataOffset\n );\n\n // seek past the basic offset table (no need to parse it again since we already have)\n const basicOffsetTable = readSequenceItem(byteStream);\n\n if (basicOffsetTable.tag !== 'xfffee000') {\n throw 'dicomParser.readEncapsulatedPixelData: missing basic offset table xfffee000';\n }\n\n byteStream.seek(basicOffsetTable.length);\n\n const fragmentZeroPosition = byteStream.position;\n\n // we should check that the number of frames + 1 is equal to the number of fragments\n // since there might be a situation where any frame before the one we are looking for\n // here is split into multiple fragments\n if (frameIndex + 1 > fragments.length) {\n throw 'dicomParser.readEncapsulatedPixelData: frame exceeds number of fragments';\n }\n\n const fragmentHeaderSize = 8;\n const byteOffset =\n fragmentZeroPosition + fragments[frameIndex].offset + fragmentHeaderSize;\n const length = fragments[frameIndex].length;\n\n // Grab ONLY the portion of the byteArray containing the frame for decoding since\n // it will be impossible to decode the entire image everytime (this return will go\n // to the decodeImageFrame function in cornerstoneWADOImageLoader which runs in a\n // web worker)\n return new Uint8Array(\n byteStream.byteArray.buffer.slice(\n byteStream.byteArray.byteOffset + byteOffset,\n byteStream.byteArray.byteOffset + byteOffset + length\n )\n );\n}\n","/* eslint no-bitwise: 0 */\n\nimport type { ByteArray } from 'dicom-parser';\n\nfunction isBitSet(byte: number, bitPos: number) {\n return byte & (1 << bitPos);\n}\n\n/**\n * Function to deal with unpacking a binary frame\n */\nfunction unpackBinaryFrame(\n byteArray: ByteArray,\n frameOffset: number,\n pixelsPerFrame: number\n): Uint8Array {\n // Create a new pixel array given the image size\n const pixelData = new Uint8Array(pixelsPerFrame);\n\n for (let i = 0; i < pixelsPerFrame; i++) {\n // Compute byte position\n const bytePos = Math.floor(i / 8);\n\n // Get the current byte\n const byte = byteArray[bytePos + frameOffset];\n\n // Bit position (0-7) within byte\n const bitPos = i % 8;\n\n // Check whether bit at bitpos is set\n pixelData[i] = isBitSet(byte, bitPos) ? 1 : 0;\n }\n\n return pixelData;\n}\n\nexport default unpackBinaryFrame;\n","import type { DataSet } from 'dicom-parser';\nimport unpackBinaryFrame from './unpackBinaryFrame';\n\n/**\n * Function to deal with extracting an image frame from an encapsulated data set.\n */\n\nfunction getUncompressedImageFrame(\n dataSet: DataSet,\n frameIndex: number\n): Uint8Array {\n const pixelDataElement =\n dataSet.elements.x7fe00010 || dataSet.elements.x7fe00008;\n const bitsAllocated = dataSet.uint16('x00280100');\n const rows = dataSet.uint16('x00280010');\n const columns = dataSet.uint16('x00280011');\n\n let samplesPerPixel = dataSet.uint16('x00280002');\n\n /**\n * From: http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.3.html\n *\n * Though the chrominance channels are downsampled, there are still nominally\n * three channels, hence Samples per Pixel (0028,0002) has a value of 3, not\n * 2. I.e., for pixel data in a Native (uncompressed) format, the Value Length\n * of Pixel Data (7FE0,0010) is not:\n *\n * Rows (0028,0010) * Columns (0028,0011) * Number of Frames (0028,0008) *\n * Samples per Pixel (0028,0002) * (⌊(Bits Allocated (0028,0100)-1)/8⌋+1)\n *\n * padded to an even length, as it would otherwise be, but rather is:\n *\n * Rows (0028,0010) * Columns (0028,0011) * Number of Frames (0028,0008) * 2 *\n * (⌊(Bits Allocated (0028,0100)-1)/8⌋+1)\n *\n * padded to an even length.\n */\n const photometricInterpretation = dataSet.string('x00280004');\n\n if (photometricInterpretation === 'YBR_FULL_422') {\n samplesPerPixel = 2;\n console.warn(\n `Using SamplesPerPixel of 2 for YBR_FULL_422 photometric interpretation.\n See http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.3.html for more information.`\n );\n }\n\n const pixelDataOffset = pixelDataElement.dataOffset;\n const pixelsPerFrame = rows * columns * samplesPerPixel;\n\n let frameOffset;\n\n if (bitsAllocated === 8) {\n frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame;\n if (frameOffset >= dataSet.byteArray.length) {\n throw new Error('frame exceeds size of pixelData');\n }\n\n return new Uint8Array(\n dataSet.byteArray.buffer.slice(frameOffset, frameOffset + pixelsPerFrame)\n );\n } else if (bitsAllocated === 16) {\n frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame * 2;\n if (frameOffset >= dataSet.byteArray.length) {\n throw new Error('frame exceeds size of pixelData');\n }\n\n return new Uint8Array(\n dataSet.byteArray.buffer.slice(\n frameOffset,\n frameOffset + pixelsPerFrame * 2\n )\n );\n } else if (bitsAllocated === 1) {\n frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame * 0.125;\n if (frameOffset >= dataSet.byteArray.length) {\n throw new Error('frame exceeds size of pixelData');\n }\n\n return unpackBinaryFrame(dataSet.byteArray, frameOffset, pixelsPerFrame);\n } else if (bitsAllocated === 32) {\n frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame * 4;\n if (frameOffset >= dataSet.byteArray.length) {\n throw new Error('frame exceeds size of pixelData');\n }\n\n return new Uint8Array(\n dataSet.byteArray.buffer.slice(\n frameOffset,\n frameOffset + pixelsPerFrame * 4\n )\n );\n }\n\n throw new Error('unsupported pixel format');\n}\n\nexport default getUncompressedImageFrame;\n","import parseImageId from './parseImageId';\nimport fileManager from './fileManager';\n\nfunction loadFileRequest(uri: string): Promise<ArrayBuffer> {\n const parsedImageId = parseImageId(uri);\n const fileIndex = parseInt(parsedImageId.url, 10);\n const file = fileManager.get(fileIndex);\n\n return new Promise<ArrayBuffer>((resolve, reject) => {\n const fileReader = new FileReader();\n\n fileReader.onload = (e) => {\n const dicomPart10AsArrayBuffer = e.target.result as ArrayBuffer;\n\n resolve(dicomPart10AsArrayBuffer);\n };\n\n fileReader.onerror = reject;\n\n fileReader.readAsArrayBuffer(file);\n });\n}\n\nexport default loadFileRequest;\n","import type { ByteArray, DataSet } from 'dicom-parser';\nimport getEncapsulatedImageFrame from './getEncapsulatedImageFrame';\nimport getUncompressedImageFrame from './getUncompressedImageFrame';\n\nfunction getPixelData(dataSet: DataSet, frameIndex = 0): ByteArray {\n const pixelDataElement =\n dataSet.elements.x7fe00010 || dataSet.elements.x7fe00008;\n\n if (!pixelDataElement) {\n return null;\n }\n\n if (pixelDataElement.encapsulatedPixelData) {\n return getEncapsulatedImageFrame(dataSet, frameIndex);\n }\n\n return getUncompressedImageFrame(dataSet, frameIndex);\n}\n\nexport default getPixelData;\n","import type { Types } from '@cornerstonejs/core';\n\n/**\n * Calculate the minimum and maximum values in an Array\n *\n * @param {Number[]} storedPixelData\n * @return {{min: Number, max: Number}}\n */\nfunction getMinMax(storedPixelData: Types.PixelDataTypedArray): {\n min: number;\n max: number;\n} {\n // we always calculate the min max values since they are not always\n // present in DICOM and we don't want to trust them anyway as cornerstone\n // depends on us providing reliable values for these\n let min = storedPixelData[0];\n\n let max = storedPixelData[0];\n\n let storedPixel;\n const numPixels = storedPixelData.length;\n\n for (let index = 1; index < numPixels; index++) {\n storedPixel = storedPixelData[index];\n min = Math.min(min, storedPixel);\n max = Math.max(max, storedPixel);\n }\n\n return {\n min,\n max,\n };\n}\n\nexport default getMinMax;\n","import {\n convertRGBColorByPixel,\n convertRGBColorByPlane,\n convertYBRFullByPixel,\n convertYBRFull422ByPixel,\n convertYBRFullByPlane,\n convertPALETTECOLOR,\n} from './colorSpaceConverters/index';\n\nfunction convertRGB(imageFrame, colorBuffer, useRGBA) {\n if (imageFrame.planarConfiguration === 0) {\n convertRGBColorByPixel(imageFrame.pixelData, colorBuffer, useRGBA);\n } else {\n convertRGBColorByPlane(imageFrame.pixelData, colorBuffer, useRGBA);\n }\n}\n\nfunction convertYBRFull(imageFrame, colorBuffer, useRGBA) {\n if (imageFrame.planarConfiguration === 0) {\n convertYBRFullByPixel(imageFrame.pixelData, colorBuffer, useRGBA);\n } else {\n convertYBRFullByPlane(imageFrame.pixelData, colorBuffer, useRGBA);\n }\n}\n\nexport default function convertColorSpace(imageFrame, colorBuffer, useRGBA) {\n // convert based on the photometric interpretation\n if (imageFrame.photometricInterpretation === 'RGB') {\n convertRGB(imageFrame, colorBuffer, useRGBA);\n } else if (imageFrame.photometricInterpretation === 'YBR_RCT') {\n convertRGB(imageFrame, colorBuffer, useRGBA);\n } else if (imageFrame.photometricInterpretation === 'YBR_ICT') {\n convertRGB(imageFrame, colorBuffer, useRGBA);\n } else if (imageFrame.photometricInterpretation === 'PALETTE COLOR') {\n convertPALETTECOLOR(imageFrame, colorBuffer, useRGBA);\n } else if (imageFrame.photometricInterpretation === 'YBR_FULL_422') {\n convertYBRFull422ByPixel(imageFrame.pixelData, colorBuffer, useRGBA);\n } else if (imageFrame.photometricInterpretation === 'YBR_FULL') {\n convertYBRFull(imageFrame, colorBuffer, useRGBA);\n } else {\n // TODO - handle YBR_PARTIAL and 420 colour spaces\n throw new Error(\n `No color space conversion for photometric interpretation ${imageFrame.photometricInterpretation}`\n );\n }\n}\n","import type { ByteArray } from 'dicom-parser';\n\nexport default function (\n imageFrame: ByteArray,\n colorBuffer: ByteArray,\n useRGBA: boolean\n): void {\n if (imageFrame === undefined) {\n throw new Error('convertYBRFull422ByPixel: ybrBuffer must be defined');\n }\n if (imageFrame.length % 2 !== 0) {\n throw new Error(\n `convertYBRFull422ByPixel: ybrBuffer length ${imageFrame.length} must be divisible by 2`\n );\n }\n\n const numPixels = imageFrame.length / 2;\n\n let ybrIndex = 0;\n\n let bufferIndex = 0;\n\n if (useRGBA) {\n for (let i = 0; i < numPixels; i += 2) {\n const y1 = imageFrame[ybrIndex++];\n const y2 = imageFrame[ybrIndex++];\n const cb = imageFrame[ybrIndex++];\n const cr = imageFrame[ybrIndex++];\n\n colorBuffer[bufferIndex++] = y1 + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y1 - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y1 + 1.772 * (cb - 128); // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n\n colorBuffer[bufferIndex++] = y2 + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y2 - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y2 + 1.772 * (cb - 128); // blue\n colorBuffer[bufferIndex++] = 255; // alpha\n }\n\n return;\n }\n\n for (let i = 0; i < numPixels; i += 2) {\n const y1 = imageFrame[ybrIndex++];\n const y2 = imageFrame[ybrIndex++];\n const cb = imageFrame[ybrIndex++];\n const cr = imageFrame[ybrIndex++];\n\n colorBuffer[bufferIndex++] = y1 + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y1 - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y1 + 1.772 * (cb - 128); // blue\n\n colorBuffer[bufferIndex++] = y2 + 1.402 * (cr - 128); // red\n colorBuffer[bufferIndex++] =\n y2 - 0.34414 * (cb - 128) - 0.71414 * (cr - 128); // green\n colorBuffer[bufferIndex++] = y2 + 1.772 * (cb - 128); // blue\n }\n}\n","import type { ByteArray } from 'dicom-parser';\nimport getMinMax from '../shared/getMinMax';\nimport type { Types } from '@cornerstonejs/core';\n\n/**\n * Special decoder for 8 bit jpeg that leverages the browser's built in JPEG decoder for increased performance\n */\n\nfunction arrayBufferToString(buffer: ArrayBuffer) {\n return binaryToString(\n String.fromCharCode.apply(\n null,\n Array.prototype.slice.apply(new Uint8Array(buffer))\n )\n );\n}\n\nfunction binaryToString(binary: string) {\n let error;\n\n try {\n return decodeURIComponent(escape(binary));\n } catch (_error) {\n error = _error;\n if (error instanceof URIError) {\n return binary;\n }\n throw error;\n }\n}\n\nfunction decodeJPEGBaseline8BitColor(\n imageFrame: Types.IImageFrame,\n pixelData: ByteArray,\n canvas: HTMLCanvasElement\n): Promise<Types.IImageFrame> {\n const start = new Date().getTime();\n const imgBlob = new Blob([pixelData], { type: 'image/jpeg' });\n\n return new Promise((resolve, reject) => {\n const fileReader = new FileReader();\n\n if (fileReader.readAsBinaryString === undefined) {\n fileReader.readAsArrayBuffer(imgBlob);\n } else {\n fileReader.readAsBinaryString(imgBlob); // doesn't work on IE11\n }\n\n fileReader.onload = function () {\n const img = new Image();\n\n img.onload = function () {\n canvas.height = img.height;\n canvas.width = img.width;\n imageFrame.rows = img.height;\n imageFrame.columns = img.width;\n const context = canvas.getContext('2d');\n\n /**\n * @todo check this context\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n context.drawImage(this as any, 0, 0);\n const imageData = context.getImageData(0, 0, img.width, img.height);\n const end = new Date().getTime();\n\n imageFrame.pixelData = new Uint8Array(imageData.data.buffer);\n imageFrame.imageData = imageData;\n imageFrame.decodeTimeInMS = end - start;\n\n // calculate smallest and largest PixelValue\n const minMax = getMinMax(imageFrame.pixelData);\n\n imageFrame.smallestPixelValue = minMax.min;\n imageFrame.largestPixelValue = minMax.max;\n imageFrame.pixelDataLength = imageFrame.pixelData.length;\n\n resolve(imageFrame);\n };\n\n img.onerror = function (error) {\n reject(error);\n };\n\n if (fileReader.readAsBinaryString === undefined) {\n img.src = `data:image/jpeg;base64,${window.btoa(\n arrayBufferToString(fileReader.result as ArrayBuffer)\n )}`;\n } else {\n img.src = `data:image/jpeg;base64,${window.btoa(\n fileReader.result as string\n )}`; // doesn't work on IE11\n }\n };\n\n fileReader.onerror = (e) => {\n reject(e);\n };\n });\n}\n\nexport default decodeJPEGBaseline8BitColor;\n","import decodeJPEGBaseline8BitColor from './decodeJPEGBaseline8BitColor';\n\n// dicomParser requires pako for browser-side decoding of deflate transfer syntax\n// We only need one function though, so lets import that so we don't make our bundle\n// too large.\nimport type { ByteArray } from 'dicom-parser';\nimport type { Types } from '@cornerstonejs/core';\nimport { getWebWorkerManager } from '@cornerstonejs/core';\nimport type { LoaderDecodeOptions } from '../types';\n\nfunction processDecodeTask(\n imageFrame: Types.IImageFrame,\n transferSyntax: string,\n pixelData: ByteArray,\n srcOptions,\n decodeConfig: LoaderDecodeOptions\n): Promise<Types.IImageFrame> {\n const options = { ...srcOptions };\n // If a loader is specified, it can't be passed through because it is a function\n // and can't be safely cloned/copied externally.\n delete options.loader;\n // Similarly, the streamData may contain larger data information and\n // although it can be passed to the decoder, it isn't needed and is slow\n delete options.streamingData;\n\n const webWorkerManager = getWebWorkerManager();\n const priority = options.priority || undefined;\n const transferList = options.transferPixelData\n ? [pixelData.buffer]\n : undefined;\n\n return webWorkerManager.executeTask(\n 'dicomImageLoader',\n 'decodeTask',\n {\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig,\n },\n {\n priority,\n requestType: options?.requestType,\n }\n );\n}\n\nfunction decodeImageFrame(\n imageFrame,\n transferSyntax,\n pixelData,\n canvas,\n options = {},\n decodeConfig\n) {\n switch (transferSyntax) {\n case '1.2.840.10008.1.2':\n // Implicit VR Little Endian\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.1':\n // Explicit VR Little Endian\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.2':\n // Explicit VR Big Endian (retired)\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.1.99':\n // Deflate transfer syntax (deflated by dicomParser)\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.5':\n // RLE Lossless\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.50':\n // JPEG Baseline lossy process 1 (8 bit)\n\n // Handle 8-bit JPEG Baseline color images using the browser's built-in\n // JPEG decoding\n if (\n imageFrame.bitsAllocated === 8 &&\n (imageFrame.samplesPerPixel === 3 || imageFrame.samplesPerPixel === 4)\n ) {\n return decodeJPEGBaseline8BitColor(imageFrame, pixelData, canvas);\n }\n\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.51':\n // JPEG Baseline lossy process 2 & 4 (12 bit)\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.57':\n // JPEG Lossless, Nonhierarchical (Processes 14)\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.70':\n // JPEG Lossless, Nonhierarchical (Processes 14 [Selection 1])\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.80':\n // JPEG-LS Lossless Image Compression\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.81':\n // JPEG-LS Lossy (Near-Lossless) Image Compression\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.90':\n // JPEG 2000 Lossless\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n case '1.2.840.10008.1.2.4.91':\n // JPEG 2000 Lossy\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n\n case '3.2.840.10008.1.2.4.96':\n case '1.2.840.10008.1.2.4.201':\n case '1.2.840.10008.1.2.4.202':\n case '1.2.840.10008.1.2.4.203':\n // HTJ2K\n return processDecodeTask(\n imageFrame,\n transferSyntax,\n pixelData,\n options,\n decodeConfig\n );\n }\n\n /* Don't know if these work...\n // JPEG 2000 Part 2 Multicomponent Image Compression (Lossless Only)\n else if(transferSyntax === \"1.2.840.10008.1.2.4.92\")\n {\n return cornerstoneDICOMImageLoader.decodeJPEG2000(dataSet, frame);\n }\n // JPEG 2000 Part 2 Multicomponent Image Compression\n else if(transferSyntax === \"1.2.840.10008.1.2.4.93\")\n {\n return cornerstoneDICOMImageLoader.decodeJPEG2000(dataSet, frame);\n }\n */\n\n return Promise.reject(\n new Error(`No decoder for transfer syntax ${transferSyntax}`)\n );\n}\n\nexport default decodeImageFrame;\n","import type { Types } from '@cornerstonejs/core';\nimport { metaData } from '@cornerstonejs/core';\n\n//\nfunction getImageFrame(imageId: string): Types.IImageFrame {\n const imagePixelModule: Types.ImagePixelModuleMetadata = metaData.get(\n 'imagePixelModule',\n imageId\n );\n\n return {\n samplesPerPixel: imagePixelModule.samplesPerPixel,\n photometricInterpretation: imagePixelModule.photometricInterpretation,\n planarConfiguration: imagePixelModule.planarConfiguration,\n rows: imagePixelModule.rows,\n columns: imagePixelModule.columns,\n bitsAllocated: imagePixelModule.bitsAllocated,\n bitsStored: imagePixelModule.bitsStored,\n pixelRepresentation: imagePixelModule.pixelRepresentation, // 0 = unsigned,\n smallestPixelValue: imagePixelModule.smallestPixelValue,\n largestPixelValue: imagePixelModule.largestPixelValue,\n redPaletteColorLookupTableDescriptor:\n imagePixelModule.redPaletteColorLookupTableDescriptor,\n greenPaletteColorLookupTableDescriptor:\n imagePixelModule.greenPaletteColorLookupTableDescriptor,\n bluePaletteColorLookupTableDescriptor:\n imagePixelModule.bluePaletteColorLookupTableDescriptor,\n redPaletteColorLookupTableData:\n imagePixelModule.redPaletteColorLookupTableData,\n greenPaletteColorLookupTableData:\n imagePixelModule.greenPaletteColorLookupTableData,\n bluePaletteColorLookupTableData:\n imagePixelModule.bluePaletteColorLookupTableData,\n pixelData: undefined, // populated later after decoding\n imageId,\n };\n}\n\nexport default getImageFrame;\n","export default function (photoMetricInterpretation: string): boolean {\n return (\n photoMetricInterpretation === 'RGB' ||\n photoMetricInterpretation === 'PALETTE COLOR' ||\n photoMetricInterpretation === 'YBR_FULL' ||\n photoMetricInterpretation === 'YBR_FULL_422' ||\n photoMetricInterpretation === 'YBR_PARTIAL_422' ||\n photoMetricInterpretation === 'YBR_PARTIAL_420' ||\n photoMetricInterpretation === 'YBR_RCT' ||\n photoMetricInterpretation === 'YBR_ICT'\n );\n}\n","import type { ByteArray } from 'dicom-parser';\nimport getMinMax from '../shared/getMinMax';\nimport getPixelDataTypeFromMinMax from '../shared/getPixelDataTypeFromMinMax';\nimport type { DICOMLoaderImageOptions, DICOMLoaderIImage } from '../types';\nimport type { Types } from '@cornerstonejs/core';\nimport {\n canRenderFloatTextures,\n Enums,\n metaData,\n utilities,\n} from '@cornerstonejs/core';\nimport convertColorSpace from './convertColorSpace';\nimport isColorConversionRequired from './isColorConversionRequired';\nimport decodeImageFrame from './decodeImageFrame';\nimport getImageFrame from './getImageFrame';\nimport getScalingParameters from './getScalingParameters';\nimport { getOptions } from './internal/options';\nimport isColorImageFn from '../shared/isColorImage';\n\nlet lastImageIdDrawn = '';\n\nfunction isModalityLUTForDisplay(sopClassUid: string): boolean {\n // special case for XA and XRF\n // https://groups.google.com/forum/#!searchin/comp.protocols.dicom/Modality$20LUT$20XA/comp.protocols.dicom/UBxhOZ2anJ0/D0R_QP8V2wIJ\n return (\n sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.1' && // XA\n sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.2.1'\n ); // XRF\n}\n\n/**\n * Helper function to set the right typed array.\n * This is needed because web workers can transfer array buffers but not typed arrays\n *\n * Here we are setting the pixel data to the right typed array based on the final\n * min and max values\n */\nfunction setPixelDataType(imageFrame) {\n const minValue = imageFrame.smallestPixelValue;\n const maxValue = imageFrame.largestPixelValue;\n\n const TypedArray = getPixelDataTypeFromMinMax(minValue, maxValue);\n\n if (TypedArray) {\n // @ts-ignore\n const typedArray = new TypedArray(imageFrame.pixelData);\n imageFrame.pixelData = typedArray;\n } else {\n throw new Error('Could not apply a typed array to the pixel data');\n }\n}\n\n/**\n * Removes the A from RGBA to return RGB buffer, this is used when the\n * decoding happens with browser API which results in RGBA, but if useRGBA flag\n * is set to false, we want to return RGB\n *\n * @param pixelData - decoded image in RGBA\n * @param targetBuffer - target buffer to write to\n */\nfunction removeAFromRGBA(\n pixelData: Types.PixelDataTypedArray,\n targetBuffer: Uint8ClampedArray | Uint8Array\n) {\n const numPixels = pixelData.length / 4;\n\n let rgbIndex = 0;\n\n let bufferIndex = 0;\n\n for (let i = 0; i < numPixels; i++) {\n targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // red\n targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // green\n targetBuffer[bufferIndex++] = pixelData[rgbIndex++]; // blue\n rgbIndex++; // skip alpha\n }\n\n return targetBuffer;\n}\n\nfunction createImage(\n imageId: string,\n pixelData: ByteArray,\n transferSyntax: string,\n options: DICOMLoaderImageOptions = {}\n): Promise<DICOMLoaderIImage | Types.IImageFrame> {\n // whether to use RGBA for color images, default true as cs-legacy uses RGBA\n // but we don't need RGBA in cs3d, and it's faster, and memory-efficient\n // in cs3d\n const useRGBA = options.useRGBA;\n\n // always preScale the pixel array unless it is asked not to\n options.preScale = {\n enabled:\n options.preScale && options.preScale.enabled !== undefined\n ? options.preScale.enabled\n : true,\n };\n\n if (!pixelData?.length) {\n return Promise.reject(new Error('The pixel data is missing'));\n }\n\n const { MetadataModules } = Enums;\n const canvas = document.createElement('canvas');\n const imageFrame = getImageFrame(imageId);\n imageFrame.decodeLevel = options.decodeLevel;\n\n options.allowFloatRendering = canRenderFloatTextures();\n\n // Get the scaling parameters from the metadata\n if (options.preScale.enabled) {\n const scalingParameters = getScalingParameters(metaData, imageId);\n\n if (scalingParameters) {\n options.preScale = {\n ...options.preScale,\n scalingParameters: scalingParameters as Types.ScalingParameters,\n };\n }\n }\n\n const { decodeConfig } = getOptions();\n\n // Remove any property of the `imageFrame` that cannot be transferred to the worker,\n // such as promises and functions.\n // This is necessary because the `imageFrame` object is passed to the worker.\n Object.keys(imageFrame).forEach((key) => {\n if (\n typeof imageFrame[key] === 'function' ||\n imageFrame[key] instanceof Promise\n ) {\n delete imageFrame[key];\n }\n });\n\n const decodePromise = decodeImageFrame(\n imageFrame,\n transferSyntax,\n pixelData,\n canvas,\n options,\n decodeConfig\n );\n\n const isColorImage = isColorImageFn(imageFrame.photometricInterpretation);\n\n return new Promise<DICOMLoaderIImage | Types.IImageFrame>(\n (resolve, reject) => {\n // eslint-disable-next-line complexity\n decodePromise.then(function (imageFrame: Types.IImageFrame) {\n // If we have a target buffer that was written to in the\n // Decode task, point the image to it here.\n let alreadyTyped = false;\n // We can safely render color image in 8 bit, so no need to convert\n if (\n options.targetBuffer &&\n options.targetBuffer.type &&\n !isColorImage\n ) {\n const {\n arrayBuffer,\n type,\n offset: rawOffset = 0,\n length: rawLength,\n } = options.targetBuffer;\n\n const imageFrameLength = imageFrame.pixelDataLength;\n\n const offset = rawOffset;\n const length =\n rawLength !== null && rawLength !== undefined\n ? rawLength\n : imageFrameLength - offset;\n\n const typedArrayConstructors = {\n Uint8Array,\n Uint16Array,\n Int16Array,\n Float32Array,\n };\n\n if (length !== imageFrame.pixelDataLength) {\n throw new Error(\n `target array for image does not have the same length (${length}) as the decoded image length (${imageFrame.pixelDataLength}).`\n );\n }\n\n const TypedArrayConstructor = typedArrayConstructors[type];\n\n // TypedArray.Set is api level and ~50x faster than copying elements even for\n // Arrays of different types, which aren't simply memcpy ops.\n const typedArray = arrayBuffer\n ? new TypedArrayConstructor(arrayBuffer, offset, length)\n : new TypedArrayConstructor(imageFrame.pixelData);\n\n if (length !== imageFrame.pixelDataLength) {\n throw new Error(\n 'target array for image does not have the same length as the decoded image length.'\n );\n }\n\n imageFrame.pixelData = typedArray;\n alreadyTyped = true;\n }\n\n if (!alreadyTyped) {\n setPixelDataType(imageFrame);\n }\n\n const imagePlaneModule: Types.ImagePlaneModuleMetadata =\n metaData.get(MetadataModules.IMAGE_PLANE, imageId) || {};\n const voiLutModule =\n metaData.get(MetadataModules.VOI_LUT, imageId) || {};\n const modalityLutModule =\n metaData.get(MetadataModules.MODALITY_LUT, imageId) || {};\n const sopCommonModule: Types.SopCommonModuleMetadata =\n metaData.get(MetadataModules.SOP_COMMON, imageId) || {};\n const calibrationModule =\n metaData.get(MetadataModules.CALIBRATION, imageId) || {};\n const { rows, columns } = imageFrame;\n\n if (isColorImage) {\n if (isColorConversionRequired(imageFrame)) {\n canvas.height = imageFrame.rows;\n canvas.width = imageFrame.columns;\n const context = canvas.getContext('2d');\n let imageData = context.createImageData(\n imageFrame.columns,\n imageFrame.rows\n );\n if (!useRGBA) {\n // Use a hard coded 3 samples per pixel for the destination, as the\n // original samples per pixel may not be 3 for palette color\n imageData = {\n ...imageData,\n data: new Uint8ClampedArray(\n 3 * imageFrame.columns * imageFrame.rows\n ),\n };\n }\n convertColorSpace(imageFrame, imageData.data, useRGBA);\n imageFrame.imageData = imageData;\n imageFrame.pixelData = imageData.data;\n imageFrame.pixelDataLength = imageData.data.length;\n } else if (\n !useRGBA &&\n imageFrame.pixelDataLength === 4 * rows * columns\n ) {\n // This case is the case where we need RGB (that is !useRGBA), and\n // we have RGBA (that is 4 values per pixel, not 3). For this case,\n // remove the A value.\n // Note: rendering libraries like vtk expect Uint8Array for RGB images\n // otherwise they will convert them to Float32Array which might be slow\n const colorBuffer = new Uint8Array(\n (imageFrame.pixelData.length / 4) * 3\n );\n\n // remove the A from the RGBA of the imageFrame\n imageFrame.pixelData = removeAFromRGBA(\n imageFrame.pixelData,\n colorBuffer\n );\n\n imageFrame.pixelDataLength = imageFrame.pixelData.length;\n }\n // else {\n // No need to do any conversion - already RGB\n // Consider RGB to RGBA conversion?\n\n /** @todo check as any */\n // calculate smallest and largest PixelValue of the converted pixelData\n const minMax = getMinMax(imageFrame.pixelData);\n\n imageFrame.smallestPixelValue = minMax.min;\n imageFrame.largestPixelValue = minMax.max;\n }\n\n const voxelManager = utilities.VoxelManager.createImageVoxelManager({\n scalarData: imageFrame.pixelData,\n width: imageFrame.columns,\n height: imageFrame.rows,\n numberOfComponents: imageFrame.samplesPerPixel,\n });\n\n const image: DICOMLoaderIImage = {\n imageId,\n dataType: imageFrame.pixelData.constructor\n .name as Types.PixelDataTypedArrayString,\n color: isColorImage,\n calibration: calibrationModule,\n columnPixelSpacing: imagePlaneModule.columnPixelSpacing,\n columns: imageFrame.columns,\n height: imageFrame.rows,\n preScale: imageFrame.preScale,\n intercept: modalityLutModule.rescaleIntercept\n ? modalityLutModule.rescaleIntercept\n : 0,\n slope: modalityLutModule.rescaleSlope\n ? modalityLutModule.rescaleSlope\n : 1,\n invert: imageFrame.photometricInterpretation === 'MONOCHROME1',\n minPixelValue: imageFrame.smallestPixelValue,\n maxPixelValue: imageFrame.largestPixelValue,\n rowPixelSpacing: imagePlaneModule.rowPixelSpacing,\n rows: imageFrame.rows,\n sizeInBytes: imageFrame.pixelData.byteLength,\n width: imageFrame.columns,\n // use the first value for rendering, if other values\n // are needed later, it can be grabbed again from the voiLUtModule\n windowCenter: voiLutModule.windowCenter\n ? voiLutModule.windowCenter[0]\n : undefined,\n windowWidth: voiLutModule.windowWidth\n ? voiLutModule.windowWidth[0]\n : undefined,\n voiLUTFunction: voiLutModule.voiLUTFunction\n ? voiLutModule.voiLUTFunction\n : undefined,\n decodeTimeInMS: imageFrame.decodeTimeInMS,\n floatPixelData: undefined,\n imageFrame,\n voxelManager,\n rgba: isColorImage && useRGBA,\n getPixelData: () => imageFrame.pixelData,\n getCanvas: undefined,\n numberOfComponents: imageFrame.samplesPerPixel,\n };\n\n if (image.color) {\n image.getCanvas = function () {\n // the getCanvas function is used in the CPU rendering path\n // and it is used to use the canvas api to draw the image\n // instead of looping through the pixel data and drawing each pixel\n // to use the canvas api, we need to convert the pixel data to a\n // Uint8ClampedArray (which is what the canvas api expects)\n // and then we can use the putImageData api to draw the image\n // However, if the image already was loaded without the alpha channel\n // we need to add the alpha channel back in\n if (lastImageIdDrawn === imageId) {\n return canvas;\n }\n\n const width = image.columns;\n const height = image.rows;\n\n canvas.height = height;\n canvas.width = width;\n const ctx = canvas.getContext('2d');\n const imageData = ctx.createImageData(width, height);\n\n const arr = imageFrame.pixelData;\n\n if (arr.length === width * height * 4) {\n for (let i = 0; i < arr.length; i++) {\n imageData.data[i] = arr[i];\n }\n }\n // Set pixel data for RGB array\n else if (arr.length === width * height * 3) {\n let j = 0;\n for (let i = 0; i < arr.length; i += 3) {\n imageData.data[j++] = arr[i];\n imageData.data[j++] = arr[i + 1];\n imageData.data[j++] = arr[i + 2];\n imageData.data[j++] = 255;\n }\n }\n\n imageFrame.pixelData = imageData.data;\n imageFrame.pixelDataLength = imageData.data.length;\n\n imageFrame.imageData = imageData;\n ctx.putImageData(imageFrame.imageData, 0, 0);\n lastImageIdDrawn = imageId;\n\n return canvas;\n };\n }\n\n // Modality LUT\n if (\n modalityLutModule.modalityLUTSequence &&\n modalityLutModule.modalityLUTSequence.length > 0 &&\n isModalityLUTForDisplay(sopCommonModule.sopClassUID)\n ) {\n image.modalityLUT = modalityLutModule.modalityLUTSequence[0];\n }\n\n // VOI LUT\n if (\n voiLutModule.voiLUTSequence &&\n voiLutModule.voiLUTSequence.length > 0\n ) {\n image.voiLUT = voiLutModule.voiLUTSequence[0];\n }\n\n if (image.color) {\n // Note that by the DICOM definition, the window width and center are\n // 256/128 for an identity transform.\n image.windowWidth = 256;\n image.windowCenter = 128;\n }\n\n // set the ww/wc to cover the dynamic range of the image if no values are supplied\n if (\n image.windowCenter === undefined ||\n image.windowWidth === undefined\n ) {\n const minVoi = image.imageFrame.smallestPixelValue;\n const maxVoi = image.imageFrame.largestPixelValue;\n\n image.windowWidth = maxVoi - minVoi;\n image.windowCenter = (maxVoi + minVoi) / 2;\n }\n resolve(image);\n }, reject);\n }\n );\n}\n\nexport default createImage;\n","import type { Types } from '@cornerstonejs/core';\n\nexport default function getPixelDataTypeFromMinMax(\n min: number,\n max: number\n): Types.PixelDataTypedArray {\n let pixelDataType;\n if (Number.isInteger(min) && Number.isInteger(max)) {\n if (min >= 0) {\n if (max <= 255) {\n pixelDataType = Uint8Array;\n } else if (max <= 65535) {\n pixelDataType = Uint16Array;\n }\n } else {\n if (min >= -128 && max <= 127) {\n pixelDataType = Int8Array;\n } else if (min >= -32768 && max <= 32767) {\n pixelDataType = Int16Array;\n }\n }\n }\n\n return pixelDataType || Float32Array;\n}\n","import type { Types } from '@cornerstonejs/core';\n\n/**\n * It returns the scaling parameters for the image with the given imageId. This can be\n * used to get passed (as an option) to the imageLoader in order to apply scaling to the image inside\n * the imageLoader.\n * @param imageId - The imageId of the image\n * @returns ScalingParameters\n */\nexport default function getScalingParameters(metaData, imageId: string) {\n const modalityLutModule = metaData.get('modalityLutModule', imageId) || {};\n\n const generalSeriesModule = (metaData.get('generalSeriesModule', imageId) ||\n {}) as Types.GeneralSeriesModuleMetadata;\n\n const { modality } = generalSeriesModule;\n\n const scalingParameters = {\n rescaleSlope: modalityLutModule.rescaleSlope,\n rescaleIntercept: modalityLutModule.rescaleIntercept,\n modality,\n };\n\n const suvFactor = metaData.get('scalingModule', imageId) || {};\n\n return {\n ...scalingParameters,\n ...(modality === 'PT' && { suvbw: suvFactor.suvbw }),\n };\n}\n","/**\n * This function checks color space conversion data requirements before\n * applying them. This function was created to solve problems like the one\n * discussed in here https://discourse.orthanc-server.org/t/orthanc-convert-ybr-to-rgb-but-does-not-change-metadata/3533/17\n * In this case, Orthanc server converts the pixel data from YBR to RGB, but maintain\n * the photometricInterpretation dicom tag in YBR\n * @param imageFrame\n * @param RGBA\n * @returns\n */\nexport default function isColorConversionRequired(imageFrame) {\n if (imageFrame === undefined) {\n return false;\n }\n const {\n rows,\n columns,\n photometricInterpretation,\n pixelDataLength,\n planarConfiguration,\n } = imageFrame;\n\n // if it is rgba don't convert (typically jpeg, jpeg-xl, jpeg2000 etc)\n if (pixelDataLength === 4 * columns * rows) {\n // RGBA - JPEG\n return false;\n }\n\n if (photometricInterpretation.endsWith('420')) {\n return (\n pixelDataLength ===\n (3 * Math.ceil(columns / 2) + Math.floor(columns / 2)) * rows\n );\n } else if (photometricInterpretation.endsWith('422')) {\n return (\n pixelDataLength ===\n (3 * Math.ceil(columns / 2) + Math.floor(columns / 2)) *\n Math.ceil(rows / 2) +\n Math.floor(rows / 2) * columns\n );\n } else {\n return photometricInterpretation !== 'RGB' || planarConfiguration === 1;\n // and it is one of the rle and lei cases then we need to convert\n }\n}\n","import type { DataSet } from 'dicom-parser';\nimport type { Types } from '@cornerstonejs/core';\nimport createImage from '../createImage';\nimport { xhrRequest } from '../internal/index';\nimport dataSetCacheManager from './dataSetCacheManager';\nimport type {\n LoadRequestFunction,\n DICOMLoaderIImage,\n DICOMLoaderImageOptions,\n} from '../../types';\nimport getPixelData from './getPixelData';\nimport loadFileRequest from './loadFileRequest';\nimport parseImageId from './parseImageId';\n\n// add a decache callback function to clear out our dataSetCacheManager\nfunction addDecache(imageLoadObject: Types.IImageLoadObject, imageId: string) {\n imageLoadObject.decache = function () {\n // console.log('decache');\n const parsedImageId = parseImageId(imageId);\n\n dataSetCacheManager.unload(parsedImageId.url);\n };\n}\n\n/**\n * Given the dataSetPromise and imageId this will return a promise to be\n * resolved with an image object containing the loaded image.\n *\n * @param dataSetPromise - A promise that resolves to a DataSet object.\n * @param imageId - The imageId of the image to be loaded.\n * @param frame - The frame number to be loaded in case of multiframe. it should\n * be noted that this is used to extract the pixelData from dicomParser and\n * dicomParser is 0-based index (the first pixelData is frame 0); however,\n * in metadata and imageId frame is 1-based index (the first frame is frame 1).\n * @param sharedCacheKey - A key to be used to cache the loaded image.\n * @param options - Options to be used when loading the image.\n * @param callbacks - Callbacks to be called when the image is loaded.\n * @returns An object containing a promise to be resolved with the loaded image\n */\nfunction loadImageFromPromise(\n dataSetPromise: Promise<DataSet>,\n imageId: string,\n frame = 0,\n sharedCacheKey: string,\n options: DICOMLoaderImageOptions,\n callbacks?: {\n imageDoneCallback: (image: DICOMLoaderIImage) => void;\n }\n): Types.IImageLoadObject {\n const start = new Date().getTime();\n const imageLoadObject: Types.IImageLoadObject = {\n cancelFn: undefined,\n promise: undefined,\n };\n\n imageLoadObject.promise = new Promise((resolve, reject) => {\n dataSetPromise.then(\n (dataSet /* , xhr*/) => {\n const pixelData = getPixelData(dataSet, frame);\n const transferSyntax = dataSet.string('x00020010');\n const loadEnd = new Date().getTime();\n const imagePromise = createImage(\n imageId,\n pixelData,\n transferSyntax,\n options\n );\n\n addDecache(imageLoadObject, imageId);\n\n imagePromise.then(\n (image) => {\n image = image as DICOMLoaderIImage;\n image.data = dataSet;\n image.sharedCacheKey = sharedCacheKey;\n const end = new Date().getTime();\n\n image.loadTimeInMS = loadEnd - start;\n image.totalTimeInMS = end - start;\n if (\n callbacks !== undefined &&\n callbacks.imageDoneCallback !== undefined\n ) {\n callbacks.imageDoneCallback(image);\n }\n resolve(image);\n },\n function (error) {\n // Reject the error, and the dataSet\n reject({\n error,\n dataSet,\n });\n }\n );\n },\n function (error) {\n // Reject the error\n reject({\n error,\n });\n }\n );\n });\n\n return imageLoadObject;\n}\n\nfunction loadImageFromDataSet(\n dataSet,\n imageId: string,\n frame = 0,\n sharedCacheKey: string,\n options\n): Types.IImageLoadObject {\n const start = new Date().getTime();\n\n const promise = new Promise<DICOMLoaderIImage | Types.IImageFrame>(\n (resolve, reject) => {\n const loadEnd = new Date().getTime();\n\n let imagePromise: Promise<DICOMLoaderIImage | Types.IImageFrame>;\n\n try {\n const pixelData = getPixelData(dataSet, frame);\n const transferSyntax = dataSet.string('x00020010');\n\n imagePromise = createImage(imageId, pixelData, transferSyntax, options);\n } catch (error) {\n // Reject the error, and the dataSet\n reject({\n error,\n dataSet,\n });\n\n return;\n }\n\n imagePromise.then((image) => {\n image = image as DICOMLoaderIImage;\n\n image.data = dataSet;\n image.sharedCacheKey = sharedCacheKey;\n const end = new Date().getTime();\n\n image.loadTimeInMS = loadEnd - start;\n image.totalTimeInMS = end - start;\n resolve(image);\n }, reject);\n }\n );\n\n return {\n promise: promise as Promise<Types.IImage>,\n cancelFn: undefined,\n };\n}\n\nfunction getLoaderForScheme(scheme: string): LoadRequestFunction {\n if (scheme === 'dicomweb' || scheme === 'wadouri') {\n return xhrRequest as LoadRequestFunction;\n } else if (scheme === 'dicomfile') {\n return loadFileRequest as LoadRequestFunction;\n }\n}\n\nfunction loadImage(\n imageId: string,\n options: DICOMLoaderImageOptions = {}\n): Types.IImageLoadObject {\n const parsedImageId = parseImageId(imageId);\n\n options = Object.assign({}, options);\n\n // IMPORTANT: if you have a custom loader that you want to use for a specific\n // scheme, you should create your own loader and register it with the scheme\n // in the image loader, and NOT just pass it in as an option. This is because\n // the scheme is used to determine the loader to use and is more maintainable\n\n // The loader isn't transferable, so ensure it is deleted\n delete options.loader;\n // The options might have a loader above, but it is a loader into the cache,\n // so not the scheme loader, which is separate and defined by the scheme here\n const schemeLoader = getLoaderForScheme(parsedImageId.scheme);\n\n // if the dataset for this url is already loaded, use it, in case of multiframe\n // images, we need to extract the frame pixelData from the dataset although the\n // image is loaded\n if (dataSetCacheManager.isLoaded(parsedImageId.url)) {\n /**\n * @todo The arguments to the dataSetCacheManager below are incorrect.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dataSet: DataSet = (dataSetCacheManager as any).get(\n parsedImageId.url,\n schemeLoader,\n imageId\n );\n\n return loadImageFromDataSet(\n dataSet,\n imageId,\n parsedImageId.pixelDataFrame,\n parsedImageId.url,\n options\n );\n }\n\n // load the dataSet via the dataSetCacheManager\n const dataSetPromise = dataSetCacheManager.load(\n parsedImageId.url,\n schemeLoader,\n imageId\n );\n\n return loadImageFromPromise(\n dataSetPromise,\n imageId,\n parsedImageId.frame,\n parsedImageId.url,\n options\n );\n}\n\nexport { loadImageFromPromise, getLoaderForScheme, loadImage };\n","import { metaData, registerImageLoader, type Types } from '@cornerstonejs/core';\nimport { loadImage } from './loadImage';\nimport { metaDataProvider } from './metaData/index';\n\nexport default function (): void {\n // register dicomweb and wadouri image loader prefixes\n registerImageLoader('dicomweb', loadImage as unknown as Types.ImageLoaderFn);\n registerImageLoader('wadouri', loadImage as unknown as Types.ImageLoaderFn);\n registerImageLoader('dicomfile', loadImage as unknown as Types.ImageLoaderFn);\n\n // add wadouri metadata provider\n metaData.addProvider(metaDataProvider);\n}\n","import {\n getImagePixelModule,\n getLUTs,\n getModalityLUTOutputPixelRepresentation,\n getNumberValues,\n metaDataProvider,\n metadataForDataset,\n} from './metaData/index';\n\nimport dataSetCacheManager from './dataSetCacheManager';\nimport fileManager from './fileManager';\nimport getEncapsulatedImageFrame from './getEncapsulatedImageFrame';\nimport getUncompressedImageFrame from './getUncompressedImageFrame';\nimport loadFileRequest from './loadFileRequest';\nimport getPixelData from './getPixelData';\nimport {\n loadImageFromPromise,\n getLoaderForScheme,\n loadImage,\n} from './loadImage';\nimport parseImageId from './parseImageId';\nimport unpackBinaryFrame from './unpackBinaryFrame';\nimport register from './register';\n\nconst metaData = {\n getImagePixelModule,\n getLUTs,\n getModalityLUTOutputPixelRepresentation,\n getNumberValues,\n metaDataProvider,\n metadataForDataset,\n};\n\nexport default {\n metaData,\n dataSetCacheManager,\n fileManager,\n getEncapsulatedImageFrame,\n getUncompressedImageFrame,\n loadFileRequest,\n loadImageFromPromise,\n getLoaderForScheme,\n getPixelData,\n loadImage,\n parseImageId,\n unpackBinaryFrame,\n register,\n};\n","import type { WADORSMetaDataElement } from '../../../types';\n\n/**\n * Returns the raw value\n *\n * @param element - The javascript object for the specified element in the metadata\n * @param [index] - the index of the value in a multi-valued element, default is 0\n * @param [defaultValue] - The default value to return if the element does not exist\n * @returns {*}\n */\nfunction getValue<ReturnType = unknown>(\n element: WADORSMetaDataElement,\n index?: number,\n defaultValue?: ReturnType\n): ReturnType {\n index = index || 0;\n if (!element) {\n return defaultValue;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return defaultValue;\n }\n // make sure we have the specified index\n if (Array.isArray(element.Value) && element.Value.length <= index) {\n return defaultValue;\n }\n\n return element.Value[index] as ReturnType;\n}\n\nexport default getValue;\n","import type { WADORSMetaDataElement } from '../../../types';\nimport getValue from './getValue';\n\n/**\n * Returns the first string value as a Javascript number\n *\n * @param element - The javascript object for the specified element in the metadata\n * @param [index] - the index of the value in a multi-valued element, default is 0\n * @param [defaultValue] - The default value to return if the element does not exist\n * @returns {*}\n */\nfunction getNumberString(\n element: WADORSMetaDataElement,\n index: number,\n defaultValue: number\n): number {\n const value = getValue<string | number>(element, index, defaultValue);\n\n if (value === undefined) {\n return;\n }\n\n return parseFloat(String(value));\n}\n\nexport default getNumberString;\n","import type { WADORSMetaDataElement } from '../../../types';\nimport getValue from './getValue';\n\nfunction getNumberValue(\n element: WADORSMetaDataElement,\n index?: number\n): number {\n const value = getValue(element, index) as string;\n\n if (value === undefined) {\n return;\n }\n\n return parseFloat(value);\n}\n\nexport default getNumberValue;\n","import type { WADORSMetaDataElement } from '../../../types';\n\n/**\n * Returns the values as an array of javascript numbers\n *\n * @param element - The javascript object for the specified element in the metadata\n * @param [minimumLength] - the minimum number of values\n * @returns {*}\n */\nfunction getNumberValues(\n element: WADORSMetaDataElement,\n minimumLength?: number\n): number[] {\n if (!element) {\n return;\n }\n // Value is not present if the attribute has a zero length value\n if (!element.Value) {\n return;\n }\n // Make sure the Value is an array\n if (!Array.isArray(element.Value)) {\n return;\n }\n // make sure we have the expected length\n if (minimumLength && element.Value.length < minimumLength) {\n return;\n }\n\n const values: number[] = [];\n\n for (let i = 0; i < element.Value.length; i++) {\n // @ts-expect-error\n values.push(parseFloat(element.Value[i]));\n }\n\n return values;\n}\n\nexport default getNumberValues;\n","/**\n * Removes the data loader scheme from the imageId\n *\n * @param {string} imageId Image ID\n * @returns {string} imageId without the data loader scheme\n * @memberof Cache\n */\nexport default function imageIdToURI(imageId: string): string {\n const colonIndex = imageId.indexOf(':');\n\n return imageId.substring(colonIndex + 1);\n}\n","export default function getTagValue(tag, justElement = true) {\n if (tag && tag.Value) {\n if (tag.Value[0] && justElement) {\n return tag.Value[0];\n }\n\n return tag.Value;\n }\n\n return tag;\n}\n","import getTagValue from './getTagValue';\n\nfunction getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frameNumber\n) {\n const shared = (\n SharedFunctionalGroupsSequence\n ? Object.values(SharedFunctionalGroupsSequence[0])\n : []\n )\n .map((it) => it[0])\n .filter((it) => it !== undefined && typeof it === 'object');\n const perFrame = (\n PerFrameFunctionalGroupsSequence\n ? Object.values(PerFrameFunctionalGroupsSequence[frameNumber - 1])\n : []\n )\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .map((it: any) => it.Value[0])\n .filter((it) => it !== undefined && typeof it === 'object');\n\n return {\n shared,\n perFrame,\n };\n}\n\nfunction getMultiframeInformation(metaData) {\n let {\n 52009230: PerFrameFunctionalGroupsSequence,\n 52009229: SharedFunctionalGroupsSequence,\n '00280008': NumberOfFrames,\n // eslint-disable-next-line prefer-const\n ...rest\n } = metaData;\n\n PerFrameFunctionalGroupsSequence = getTagValue(\n PerFrameFunctionalGroupsSequence,\n false\n );\n SharedFunctionalGroupsSequence = getTagValue(\n SharedFunctionalGroupsSequence,\n false\n );\n NumberOfFrames = getTagValue(NumberOfFrames);\n\n return {\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n NumberOfFrames,\n rest,\n };\n}\n// function that retrieves specific frame metadata information from multiframe\n// metadata\nfunction combineFrameInstance(frameNumber, instance) {\n const {\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n NumberOfFrames,\n rest,\n } = getMultiframeInformation(instance);\n\n if (PerFrameFunctionalGroupsSequence || NumberOfFrames > 1) {\n const { shared, perFrame } = getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frameNumber\n );\n\n const newInstance = Object.assign(instance, { frameNumber });\n\n // merge the shared first then the per frame to override\n [...shared, ...perFrame].forEach((item) => {\n Object.entries(item).forEach(([key, value]) => {\n newInstance[key] = value;\n });\n });\n\n return Object.assign(rest, { '00280008': NumberOfFrames }, newInstance);\n }\n\n return instance;\n}\n\nexport { combineFrameInstance, getMultiframeInformation, getFrameInformation };\n","import type { WADORSMetaData } from '../../types';\nimport imageIdToURI from '../imageIdToURI';\nimport { combineFrameInstance } from './combineFrameInstance';\n\nlet metadataByImageURI = [];\nlet multiframeMetadataByImageURI = {};\n\nimport getValue from './metaData/getValue';\n\n// get metadata information for the first frame\nfunction _retrieveMultiframeMetadataImageURI(imageURI) {\n const lastSlashIdx = imageURI.indexOf('/frames/') + 8;\n // imageid string without frame number\n const imageIdFrameless = imageURI.slice(0, lastSlashIdx);\n // calculating frame number\n const frame = parseInt(imageURI.slice(lastSlashIdx), 10);\n // retrieving the frame 1 that contains multiframe information\n\n const metadata = metadataByImageURI[`${imageIdFrameless}1`];\n\n return {\n metadata,\n frame,\n };\n}\n\nfunction retrieveMultiframeMetadataImageId(imageId) {\n const imageURI = imageIdToURI(imageId);\n\n return _retrieveMultiframeMetadataImageURI(imageURI);\n}\n\nfunction isMultiframe(metadata) {\n // Checks if dicomTag NumberOf Frames exists and it is greater than one\n const numberOfFrames = getValue<number>(metadata['00280008']);\n\n return numberOfFrames && numberOfFrames > 1;\n}\n\nfunction add(imageId: string, metadata: WADORSMetaData) {\n const imageURI = imageIdToURI(imageId);\n\n Object.defineProperty(metadata, 'isMultiframe', {\n value: isMultiframe(metadata),\n enumerable: false,\n });\n\n metadataByImageURI[imageURI] = metadata;\n}\n\n// multiframes images will have only one imageId returned by the dicomweb\n// client and registered in metadataByImageURI for all the n frames. If an\n// imageId does not have metadata, or it does not have at all, or the imageID\n// belongs to a frame, not registered in metadataByImageURI\nfunction get(imageId: string): WADORSMetaData {\n const imageURI = imageIdToURI(imageId);\n\n // Check if the metadata is already available\n const metadata = metadataByImageURI[imageURI];\n\n if (metadata && !metadata?.isMultiframe) {\n // Return the metadata for single-frame images\n return metadata;\n }\n\n const cachedMetadata = multiframeMetadataByImageURI[imageURI];\n\n if (cachedMetadata) {\n return cachedMetadata;\n }\n\n // Try to get the metadata for a specific frame of a multiframe image\n const retrievedMetadata = _retrieveMultiframeMetadataImageURI(imageURI);\n\n if (!retrievedMetadata || !retrievedMetadata.metadata) {\n return;\n }\n\n const { metadata: firstFrameMetadata, frame } = retrievedMetadata;\n\n if (firstFrameMetadata) {\n // Combine the metadata from the first frame with the metadata from the specified frame\n const combined = combineFrameInstance(frame, firstFrameMetadata);\n\n multiframeMetadataByImageURI[imageURI] = combined;\n\n return combined;\n }\n}\n\nfunction remove(imageId) {\n const imageURI = imageIdToURI(imageId);\n\n metadataByImageURI[imageURI] = undefined;\n\n multiframeMetadataByImageURI[imageURI] = undefined;\n}\n\nfunction purge() {\n metadataByImageURI = [];\n multiframeMetadataByImageURI = {};\n}\n\nexport { metadataByImageURI, isMultiframe, retrieveMultiframeMetadataImageId };\n\nexport default {\n add,\n get,\n remove,\n purge,\n};\n","import getTagValue from '../getTagValue';\nimport getValue from './getValue';\nimport isNMReconstructable from '../../isNMReconstructable';\nimport getNumberValues from './getNumberValues';\n\n/**\n * Checks if the modality is Nuclear Medicine (NM)\n * @param metaData The metadata object containing DICOM tags\n * @returns True if the modality includes 'NM', false otherwise\n */\nfunction isNMModality(metaData) {\n const modality = getValue(metaData['00080060']) as string;\n\n return modality.includes('NM');\n}\n\n/**\n * Get a subpart of Image Type dicom tag defined by index\n * @param {*} metaData\n * @param {*} index 0 based index of the subtype\n */\nfunction getImageTypeSubItemFromMetadata(metaData, index) {\n const imageType = getTagValue(metaData['00080008'], false);\n\n if (imageType) {\n // const subTypes = imageType.split('\\\\');\n\n // if (subTypes.length > index) {\n // return subTypes[index];\n // }\n return imageType[index];\n }\n\n return undefined;\n}\n/**\n * Extracts the orientation from NM multiframe metadata, if image type\n * equal to RECON TOMO or RECON GATED TOMO\n * @param {*} metaData\n * @returns\n */\nfunction extractOrientationFromNMMultiframeMetadata(metaData) {\n let imageOrientationPatient;\n const imageSubType = getImageTypeSubItemFromMetadata(metaData, 2);\n\n if (imageSubType && isNMReconstructable(imageSubType)) {\n const detectorInformationSequence = getTagValue(metaData['00540022']);\n\n if (detectorInformationSequence) {\n imageOrientationPatient = getNumberValues(\n detectorInformationSequence['00200037'],\n 6\n );\n }\n }\n\n return imageOrientationPatient;\n}\n\n/**\n * Extracts the position from NM multiframe dataset, if image type\n * equal to RECON TOMO or RECON GATED TOMO\n * @param {*} metaData\n * @returns\n */\nfunction extractPositionFromNMMultiframeMetadata(metaData) {\n let imagePositionPatient;\n const imageSubType = getImageTypeSubItemFromMetadata(metaData, 2);\n\n if (imageSubType && isNMReconstructable(imageSubType)) {\n const detectorInformationSequence = getTagValue(metaData['00540022']);\n\n if (detectorInformationSequence) {\n imagePositionPatient = getNumberValues(\n detectorInformationSequence['00200032'],\n 3\n );\n }\n }\n\n return imagePositionPatient;\n}\n\nexport {\n extractOrientationFromNMMultiframeMetadata,\n extractPositionFromNMMultiframeMetadata,\n isNMModality,\n getImageTypeSubItemFromMetadata,\n};\n","import getNumberValues from './getNumberValues';\nimport {\n extractOrientationFromNMMultiframeMetadata,\n extractPositionFromNMMultiframeMetadata,\n isNMModality,\n} from './NMHelpers';\n\n/**\n * Extract orientation information from a metadata. It tries to get the orientation\n * from the Detector Information Sequence (for NM images) if image type equal\n * to RECON TOMO or RECON GATED TOMO\n * @param {*} metaData\n * @returns\n */\nfunction extractOrientationFromMetadata(metaData) {\n let imageOrientationPatient = getNumberValues(metaData['00200037'], 6);\n\n // If orientation not valid to this point, trying to get the orientation\n // from the Detector Information Sequence (for NM images) with image type\n // equal to RECON TOMO or RECON GATED TOMO\n\n if (!imageOrientationPatient && isNMModality(metaData)) {\n imageOrientationPatient =\n extractOrientationFromNMMultiframeMetadata(metaData);\n }\n\n return imageOrientationPatient;\n}\n\n/**\n * Extract position information from a metaData. It tries to get the position\n * from the Detector Information Sequence (for NM images) if image type equal\n * to RECON TOMO or RECON GATED TOMO\n * @param {*} metaData\n * @returns\n */\nfunction extractPositionFromMetadata(metaData) {\n let imagePositionPatient = getNumberValues(metaData['00200032'], 3);\n\n // If position not valid to this point, trying to get the position\n // from the Detector Information Sequence (for NM images)\n if (!imagePositionPatient && isNMModality(metaData)) {\n imagePositionPatient = extractPositionFromNMMultiframeMetadata(metaData);\n }\n\n return imagePositionPatient;\n}\n\nexport { extractOrientationFromMetadata, extractPositionFromMetadata };\n","import getNumberValues from './getNumberValues';\n\n/**\n * This helper function retrieves the first number value from the provided sequence for the given key.\n * @param sequence - The sequence from which to retrieve the number value.\n * @param key - The key for which to retrieve the number value.\n * @returns The first number value for the given key, or null if no value is found.\n */\nfunction getFirstNumberValue(sequence: unknown, key: string): number | null {\n const values = getNumberValues(sequence[key]);\n return values ? values[0] : null;\n}\n\nexport { getFirstNumberValue };\n","import type { WADORSMetaDataElement } from '../../../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSequenceItems(element: any): WADORSMetaDataElement[] {\n // Value is not present if the attribute has a zero length value\n if (!element?.Value?.length) {\n return [];\n }\n\n if (!Array.isArray(element.Value)) {\n // If the Value is an object, encapsulate it in an array and log a warning message\n if (typeof element.Value === 'object') {\n console.warn(\n 'Warning: Value should be an array, but an object was found. Encapsulating the object in an array.'\n );\n return [element.Value];\n }\n return [];\n }\n return element.Value;\n}\n\nexport default getSequenceItems;\n","import { getFirstNumberValue } from './getFirstNumberValue';\nimport getSequenceItems from './getSequenceItems';\n\n/**\n * This function retrieves the ultrasound regions from the provided metadata.\n * @param metadata - The metadata from which to retrieve the ultrasound regions.\n * @returns An array of ultrasound regions, or null if no regions are found.\n */\nfunction getUSEnhancedRegions(metadata) {\n const sequenceOfUltrasoundRegions = getSequenceItems(metadata['00186011']);\n\n if (!sequenceOfUltrasoundRegions || !sequenceOfUltrasoundRegions.length) {\n return null;\n }\n\n const regions = sequenceOfUltrasoundRegions.map((sequence) => {\n const physicalDeltaX = getFirstNumberValue(sequence, '0018602C');\n const physicalDeltaY = getFirstNumberValue(sequence, '0018602E');\n const physicalUnitsXDirection = getFirstNumberValue(sequence, '00186024');\n const physicalUnitsYDirection = getFirstNumberValue(sequence, '00186026');\n\n const regionLocationMinY0 = getFirstNumberValue(sequence, '0018601A');\n const regionLocationMaxY1 = getFirstNumberValue(sequence, '0018601E');\n const regionLocationMinX0 = getFirstNumberValue(sequence, '00186018');\n const regionLocationMaxX1 = getFirstNumberValue(sequence, '0018601C');\n const referencePixelX0 = getFirstNumberValue(sequence, '00186020');\n const referencePixelY0 = getFirstNumberValue(sequence, '00186022');\n\n const referencePhysicalPixelValueY = getFirstNumberValue(\n sequence,\n '0018602A'\n );\n const referencePhysicalPixelValueX = getFirstNumberValue(\n sequence,\n '00186028'\n );\n const regionSpatialFormat = getFirstNumberValue(sequence, '00186012');\n\n const regionDataType = getFirstNumberValue(sequence, '00186014');\n const regionFlags = getFirstNumberValue(sequence, '00186016');\n const transducerFrequency = getFirstNumberValue(sequence, '00186030');\n\n return {\n regionLocationMinY0,\n regionLocationMaxY1,\n regionLocationMinX0,\n regionLocationMaxX1,\n referencePixelX0,\n referencePixelY0,\n physicalDeltaX,\n physicalDeltaY,\n physicalUnitsXDirection,\n physicalUnitsYDirection,\n referencePhysicalPixelValueY,\n referencePhysicalPixelValueX,\n regionSpatialFormat,\n regionDataType,\n regionFlags,\n transducerFrequency,\n };\n });\n\n return regions;\n}\nexport { getUSEnhancedRegions };\n","import * as dicomParser from 'dicom-parser';\nimport { Enums, utilities } from '@cornerstonejs/core';\nimport getNumberValues from './getNumberValues';\nimport getNumberValue from './getNumberValue';\nimport getOverlayPlaneModule from './getOverlayPlaneModule';\nimport metaDataManager, {\n retrieveMultiframeMetadataImageId,\n} from '../metaDataManager';\nimport getValue from './getValue';\nimport {\n getMultiframeInformation,\n getFrameInformation,\n} from '../combineFrameInstance';\nimport {\n extractOrientationFromMetadata,\n extractPositionFromMetadata,\n} from './extractPositioningFromMetadata';\nimport { getImageTypeSubItemFromMetadata } from './NMHelpers';\nimport isNMReconstructable from '../../isNMReconstructable';\nimport {\n getInstanceModule,\n instanceModuleNames,\n} from '../../getInstanceModule';\nimport { getUSEnhancedRegions } from './USHelpers';\n\nfunction metaDataProvider(type, imageId) {\n const { MetadataModules } = Enums;\n\n if (type === MetadataModules.MULTIFRAME) {\n // the get function removes the PerFrameFunctionalGroupsSequence\n const { metadata, frame } = retrieveMultiframeMetadataImageId(imageId);\n\n if (!metadata) {\n return;\n }\n const {\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n NumberOfFrames,\n } = getMultiframeInformation(metadata);\n\n if (PerFrameFunctionalGroupsSequence || NumberOfFrames > 1) {\n const { shared, perFrame } = getFrameInformation(\n PerFrameFunctionalGroupsSequence,\n SharedFunctionalGroupsSequence,\n frame\n );\n\n return {\n NumberOfFrames,\n //PerFrameFunctionalGroupsSequence,\n PerFrameFunctionalInformation: perFrame,\n SharedFunctionalInformation: shared,\n };\n }\n\n return {\n NumberOfFrames,\n //PerFrameFunctionalGroupsSequence,\n };\n }\n\n const metaData = metaDataManager.get(imageId);\n\n if (!metaData) {\n return;\n }\n\n if (type === MetadataModules.GENERAL_STUDY) {\n return {\n studyDescription: getValue<string>(metaData['00081030']),\n studyDate: dicomParser.parseDA(getValue<string>(metaData['00080020'])),\n studyTime: dicomParser.parseTM(\n getValue<string>(metaData['00080030'], 0, '')\n ),\n accessionNumber: getValue<string>(metaData['00080050']),\n };\n }\n\n if (type === MetadataModules.GENERAL_SERIES) {\n return {\n modality: getValue<string>(metaData['00080060']),\n seriesInstanceUID: getValue<string>(metaData['0020000E']),\n seriesNumber: getNumberValue(metaData['00200011']),\n studyInstanceUID: getValue<string>(metaData['0020000D']),\n seriesDate: dicomParser.parseDA(getValue<string>(metaData['00080021'])),\n seriesTime: dicomParser.parseTM(\n getValue<string>(metaData['00080031'], 0, '')\n ),\n acquisitionDate: dicomParser.parseDA(\n getValue<string>(metaData['00080022'])\n ),\n acquisitionTime: dicomParser.parseTM(\n getValue<string>(metaData['00080032'], 0, '')\n ),\n };\n }\n\n if (type === MetadataModules.GENERAL_IMAGE) {\n return {\n sopInstanceUID: getValue<string>(metaData['00080018']),\n instanceNumber: getNumberValue(metaData['00200013']),\n lossyImageCompression: getValue<string>(metaData['00282110']),\n lossyImageCompressionRatio: getNumberValue(metaData['00282112']),\n lossyImageCompressionMethod: getValue<string>(metaData['00282114']),\n };\n }\n\n if (type === MetadataModules.PATIENT) {\n return {\n patientID: getValue<string>(metaData['00100020']),\n patientName: getValue<string>(metaData['00100010']),\n };\n }\n\n if (type === MetadataModules.PATIENT_STUDY) {\n return {\n patientAge: getNumberValue(metaData['00101010']),\n patientSize: getNumberValue(metaData['00101020']),\n patientSex: getValue<'M' | 'F'>(metaData['00100040']),\n patientWeight: getNumberValue(metaData['00101030']),\n };\n }\n\n if (type === MetadataModules.NM_MULTIFRAME_GEOMETRY) {\n const modality = getValue(metaData['00080060']) as string;\n const imageSubType = getImageTypeSubItemFromMetadata(metaData, 2);\n\n return {\n modality,\n imageType: getValue(metaData['00080008']),\n imageSubType,\n imageOrientationPatient: extractOrientationFromMetadata(metaData),\n imagePositionPatient: extractPositionFromMetadata(metaData),\n sliceThickness: getNumberValue(metaData['00180050']),\n spacingBetweenSlices: getNumberValue(metaData['00180088']),\n pixelSpacing: getNumberValues(metaData['00280030'], 2),\n numberOfFrames: getNumberValue(metaData['00280008']),\n isNMReconstructable:\n isNMReconstructable(imageSubType) && modality.includes('NM'),\n };\n }\n\n if (type === MetadataModules.IMAGE_PLANE) {\n //metaData = fixNMMetadata(metaData);\n let imageOrientationPatient = extractOrientationFromMetadata(metaData);\n let imagePositionPatient = extractPositionFromMetadata(metaData);\n const pixelSpacing = getNumberValues(metaData['00280030'], 2);\n\n let columnPixelSpacing = null;\n let rowPixelSpacing = null;\n let rowCosines = null;\n let columnCosines = null;\n\n let usingDefaultValues = false;\n if (pixelSpacing) {\n rowPixelSpacing = pixelSpacing[0];\n columnPixelSpacing = pixelSpacing[1];\n } else {\n usingDefaultValues = true;\n rowPixelSpacing = 1;\n columnPixelSpacing = 1;\n }\n\n if (imageOrientationPatient) {\n rowCosines = [\n // @ts-expect-error\n parseFloat(imageOrientationPatient[0]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[1]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[2]),\n ];\n columnCosines = [\n // @ts-expect-error\n parseFloat(imageOrientationPatient[3]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[4]),\n // @ts-expect-error\n parseFloat(imageOrientationPatient[5]),\n ];\n } else {\n rowCosines = [0, 1, 0];\n columnCosines = [0, 0, -1];\n usingDefaultValues = true;\n imageOrientationPatient = [...rowCosines, ...columnCosines];\n }\n\n if (!imagePositionPatient) {\n imagePositionPatient = [0, 0, 0];\n usingDefaultValues = true;\n }\n\n return {\n frameOfReferenceUID: getValue<string>(metaData['00200052']),\n rows: getNumberValue(metaData['00280010']),\n columns: getNumberValue(metaData['00280011']),\n imageOrientationPatient,\n rowCosines,\n columnCosines,\n imagePositionPatient,\n sliceThickness: getNumberValue(metaData['00180050']),\n sliceLocation: getNumberValue(metaData['00201041']),\n pixelSpacing,\n rowPixelSpacing,\n columnPixelSpacing,\n usingDefaultValues,\n };\n }\n\n if (type === MetadataModules.ULTRASOUND_ENHANCED_REGION) {\n return getUSEnhancedRegions(metaData);\n }\n\n if (type === MetadataModules.CALIBRATION) {\n const modality = getValue(metaData['00080060']);\n\n if (modality === 'US') {\n const enhancedRegion = getUSEnhancedRegions(metaData);\n return {\n sequenceOfUltrasoundRegions: enhancedRegion,\n };\n }\n }\n\n if (type === MetadataModules.IMAGE_URL) {\n return getImageUrlModule(imageId, metaData);\n }\n\n if (type === MetadataModules.CINE) {\n return getCineModule(imageId, metaData);\n }\n\n if (type === MetadataModules.IMAGE_PIXEL) {\n return {\n samplesPerPixel: getNumberValue(metaData['00280002']),\n photometricInterpretation: getValue(metaData['00280004']),\n rows: getNumberValue(metaData['00280010']),\n columns: getNumberValue(metaData['00280011']),\n bitsAllocated: getNumberValue(metaData['00280100']),\n bitsStored: getNumberValue(metaData['00280101']),\n highBit: getValue(metaData['00280102']),\n pixelRepresentation: getNumberValue(metaData['00280103']),\n planarConfiguration: getNumberValue(metaData['00280006']),\n pixelAspectRatio: getValue(metaData['00280034']),\n smallestPixelValue: getNumberValue(metaData['00280106']),\n largestPixelValue: getNumberValue(metaData['00280107']),\n redPaletteColorLookupTableDescriptor: getNumberValues(\n metaData['00281101']\n ),\n greenPaletteColorLookupTableDescriptor: getNumberValues(\n metaData['00281102']\n ),\n bluePaletteColorLookupTableDescriptor: getNumberValues(\n metaData['00281103']\n ),\n redPaletteColorLookupTableData: getNumberValues(metaData['00281201']),\n greenPaletteColorLookupTableData: getNumberValues(metaData['00281202']),\n bluePaletteColorLookupTableData: getNumberValues(metaData['00281203']),\n };\n }\n\n if (type === MetadataModules.VOI_LUT) {\n return {\n // TODO VOT LUT Sequence\n windowCenter: getNumberValues(metaData['00281050'], 1),\n windowWidth: getNumberValues(metaData['00281051'], 1),\n };\n }\n\n if (type === MetadataModules.MODALITY_LUT) {\n return {\n // TODO VOT LUT Sequence\n rescaleIntercept: getNumberValue(metaData['00281052']),\n rescaleSlope: getNumberValue(metaData['00281053']),\n rescaleType: getValue(metaData['00281054']),\n };\n }\n\n if (type === MetadataModules.SOP_COMMON) {\n return {\n sopClassUID: getValue<string>(metaData['00080016']),\n sopInstanceUID: getValue<string>(metaData['00080018']),\n };\n }\n\n if (type === MetadataModules.PET_ISOTOPE) {\n const radiopharmaceuticalInfo = getValue(metaData['00540016']);\n\n if (radiopharmaceuticalInfo === undefined) {\n return;\n }\n\n return {\n radiopharmaceuticalInfo: {\n radiopharmaceuticalStartTime: dicomParser.parseTM(\n getValue(radiopharmaceuticalInfo['00181072'], 0, '')\n ),\n radiopharmaceuticalStartDateTime: getValue(\n radiopharmaceuticalInfo['00181078'],\n 0,\n ''\n ),\n radionuclideTotalDose: getNumberValue(\n radiopharmaceuticalInfo['00181074']\n ),\n radionuclideHalfLife: getNumberValue(\n radiopharmaceuticalInfo['00181075']\n ),\n },\n };\n }\n\n if (type === MetadataModules.OVERLAY_PLANE) {\n return getOverlayPlaneModule(metaData);\n }\n\n // Note: this is not a DICOM module, but a useful metadata that can be\n // retrieved from the image\n if (type === 'transferSyntax') {\n return getTransferSyntax(imageId, metaData);\n }\n\n if (type === MetadataModules.PET_SERIES) {\n return {\n correctedImage: getValue(metaData['00280051']),\n units: getValue(metaData['00541001']),\n decayCorrection: getValue(metaData['00541102']),\n };\n }\n\n if (type === MetadataModules.PET_IMAGE) {\n return {\n frameReferenceTime: getNumberValue(metaData['00541300']),\n actualFrameDuration: getNumberValue(metaData['00181242']),\n };\n }\n\n // Note: this is not a DICOM module, but rather an aggregation on all others\n if (type === 'instance') {\n return getInstanceModule(imageId, metaDataProvider, instanceModuleNames);\n }\n}\n\nexport function getImageUrlModule(imageId, metaData) {\n const { transferSyntaxUID } = getTransferSyntax(imageId, metaData);\n const isVideo = utilities.isVideoTransferSyntax(transferSyntaxUID);\n const imageUrl = imageId.substring(7);\n const thumbnail = imageUrl.replace('/frames/', '/thumbnail/');\n let rendered = imageUrl.replace('/frames/', '/rendered/');\n if (isVideo) {\n rendered = rendered.replace('/rendered/1', '/rendered');\n }\n return {\n isVideo,\n rendered,\n thumbnail,\n };\n}\n\nexport function getCineModule(imageId, metaData) {\n const cineRate = getValue<string>(metaData['00180040']);\n return {\n cineRate,\n numberOfFrames: getNumberValue(metaData['00280008']),\n };\n}\n\nexport function getTransferSyntax(imageId, metaData) {\n // Use either the FMI, which is NOT permitted in the DICOMweb data, but\n // is sometimes found there anyways, or the available transfer syntax, which\n // is the recommended way of getting it.\n return {\n transferSyntaxUID:\n getValue<string>(metaData['00020010']) ||\n getValue<string>(metaData['00083002']),\n };\n}\n\nexport default metaDataProvider;\n","import getValue from './getValue';\nimport getNumberValue from './getNumberValue';\nimport type { WADORSMetaData } from '../../../types';\n\nexport default function getOverlayPlaneModule(metaData: WADORSMetaData) {\n const overlays = [];\n\n for (let overlayGroup = 0x00; overlayGroup <= 0x1e; overlayGroup += 0x02) {\n let groupStr = `x60${overlayGroup.toString(16)}`;\n\n if (groupStr.length === 4) {\n groupStr = `x600${overlayGroup.toString(16)}`;\n }\n\n /**\n * @todo there is a type issue with WADORSMetaData. Currently WADORSMetaData\n * on includes string[] | number[] | boolean. from the look of this, data\n * is a more complex type\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = getValue(metaData[`${groupStr}3000`]) as any;\n\n if (!data) {\n continue;\n }\n\n const pixelData = [];\n\n for (let i = 0; i < data.length; i++) {\n for (let k = 0; k < 8; k++) {\n const byte_as_int = metaData.Value[data.dataOffset + i];\n\n pixelData[i * 8 + k] = (byte_as_int >> k) & 0b1; // eslint-disable-line no-bitwise\n }\n }\n\n overlays.push({\n rows: getNumberValue(metaData[`${groupStr}0010`]),\n columns: getNumberValue(metaData[`${groupStr}0011`]),\n type: getValue(metaData[`${groupStr}0040`]),\n x: getNumberValue(metaData[`${groupStr}0050`], 1) - 1,\n y: getNumberValue(metaData[`${groupStr}0050`], 0) - 1,\n pixelData,\n description: getValue(metaData[`${groupStr}0022`]),\n label: getValue(metaData[`${groupStr}1500`]),\n roiArea: getValue(metaData[`${groupStr}1301`]),\n roiMean: getValue(metaData[`${groupStr}1302`]),\n roiStandardDeviation: getValue(metaData[`${groupStr}1303`]),\n });\n }\n\n return {\n overlays,\n };\n}\n","import type { Types, Enums } from '@cornerstonejs/core';\nimport { getOptions } from './options';\nimport type {\n LoaderXhrRequestError,\n LoaderXhrRequestPromise,\n} from '../../types';\nimport metaDataManager from '../wadors/metaDataManager';\nimport extractMultipart from '../wadors/extractMultipart';\nimport { getImageQualityStatus } from '../wadors/getImageQualityStatus';\nimport type { CornerstoneWadoRsLoaderOptions } from '../wadors/loadImage';\n\ntype RangeRetrieveOptions = Types.RangeRetrieveOptions;\n\n/**\n * Performs a range request to fetch part of an encoded image, typically\n * so that partial resolution images can be fetched.\n * The configuration of exactly what is requested is based on the transfer\n * syntax provided.\n * Note this generates 1 response for each call, and those reponses may or may\n * not be combined with each other depending on the configuration applied.\n *\n * * HTJ2K Streaming TSUID -> Use actual range requests, and set it up for streaming\n * image decoding of byte range requests\n * * JLS and Non-streaming HTJ2K -> Use a sub-resolution (or thumbnail) endpoint\n * followed by normal endpoint\n *\n * @param url - including an fsiz parameter\n * @param imageId - to fetch for\n * @param defaultHeaders - to add to the request\n * @returns Compressed image data\n */\nexport default function rangeRequest(\n url: string,\n imageId: string,\n defaultHeaders: Record<string, string> = {},\n options: CornerstoneWadoRsLoaderOptions = {}\n): LoaderXhrRequestPromise<{\n contentType: string;\n pixelData: Uint8Array;\n imageQualityStatus: Enums.ImageQualityStatus;\n percentComplete: number;\n}> {\n const globalOptions = getOptions();\n const { retrieveOptions = {} as RangeRetrieveOptions, streamingData } =\n options;\n const chunkSize =\n streamingData.chunkSize ||\n getValue(imageId, retrieveOptions, 'chunkSize') ||\n 65536;\n\n const errorInterceptor = (err) => {\n if (typeof globalOptions.errorInterceptor === 'function') {\n const error = new Error('request failed') as LoaderXhrRequestError;\n globalOptions.errorInterceptor(error);\n } else {\n console.warn('rangeRequest:Caught', err);\n }\n };\n\n // Make the request for the streamable image frame (i.e. HTJ2K)\n const promise = new Promise<{\n contentType: string;\n pixelData: Uint8Array;\n percentComplete: number;\n imageQualityStatus: Enums.ImageQualityStatus;\n // eslint-disable-next-line no-async-promise-executor\n }>(async (resolve, reject) => {\n const headers = Object.assign(\n {},\n defaultHeaders\n /* beforeSendHeaders */\n );\n\n Object.keys(headers).forEach(function (key) {\n if (headers[key] === null || headers[key] === undefined) {\n delete headers[key];\n }\n });\n\n try {\n if (!streamingData.encodedData) {\n streamingData.chunkSize = chunkSize;\n streamingData.rangesFetched = 0;\n }\n const byteRange = getByteRange(streamingData, retrieveOptions);\n\n const { encodedData, responseHeaders } = await fetchRangeAndAppend(\n url,\n headers,\n byteRange,\n streamingData\n );\n\n // Resolve promise with the first range, so it can be passed through to\n // cornerstone via the usual image loading pathway. All subsequent\n // ranges will be passed and decoded via events.\n const contentType = responseHeaders.get('content-type');\n const { totalBytes } = streamingData;\n const doneAllBytes = totalBytes === encodedData.byteLength;\n const extract = extractMultipart(contentType, encodedData, {\n isPartial: true,\n });\n\n // Allow over-writing the done status to indicate complete on partial\n const imageQualityStatus = getImageQualityStatus(\n retrieveOptions,\n doneAllBytes || extract.extractDone\n );\n resolve({\n ...extract,\n imageQualityStatus,\n percentComplete: extract.extractDone\n ? 100\n : (chunkSize * 100) / totalBytes,\n });\n } catch (err) {\n errorInterceptor(err);\n console.error(err);\n reject(err);\n }\n });\n\n return promise;\n}\n\nasync function fetchRangeAndAppend(\n url: string,\n headers: Record<string, string>,\n range: [number, number | ''],\n streamingData\n) {\n if (range) {\n headers = Object.assign(headers, {\n Range: `bytes=${range[0]}-${range[1]}`,\n });\n }\n let { encodedData } = streamingData;\n if (range[1] && encodedData?.byteLength > range[1]) {\n return streamingData;\n }\n const response = await fetch(url, {\n headers,\n signal: undefined,\n });\n\n const responseArrayBuffer = await response.arrayBuffer();\n const responseTypedArray = new Uint8Array(responseArrayBuffer);\n const { status } = response;\n\n // Append new data\n let newByteArray: Uint8Array;\n if (encodedData) {\n newByteArray = new Uint8Array(\n encodedData.length + responseTypedArray.length\n );\n newByteArray.set(encodedData, 0);\n newByteArray.set(responseTypedArray, encodedData.length);\n streamingData.rangesFetched = 1;\n } else {\n newByteArray = new Uint8Array(responseTypedArray.length);\n newByteArray.set(responseTypedArray, 0);\n streamingData.rangesFetched++;\n }\n streamingData.encodedData = encodedData = newByteArray;\n streamingData.responseHeaders = response.headers;\n\n const contentRange = response.headers.get('Content-Range');\n if (contentRange) {\n streamingData.totalBytes = Number(contentRange.split('/')[1]);\n } else if (status !== 206 || !range) {\n streamingData.totalBytes = encodedData?.byteLength;\n } else if (range[1] === '' || encodedData?.length < range[1]) {\n streamingData.totalBytes = encodedData.byteLength;\n } else {\n streamingData.totalBytes = Number.MAX_SAFE_INTEGER;\n }\n\n return streamingData;\n}\n\nfunction getValue(imageId: string, src, attr: string) {\n const value = src[attr];\n if (typeof value !== 'function') {\n return value;\n }\n const metaData = metaDataManager.get(imageId);\n return value(metaData, imageId);\n}\n\nfunction getByteRange(\n streamingData,\n retrieveOptions: RangeRetrieveOptions\n): [number, number | ''] {\n const { totalBytes, encodedData, chunkSize = 65536 } = streamingData;\n const { rangeIndex = 0 } = retrieveOptions;\n if (rangeIndex === -1 && (!totalBytes || !encodedData)) {\n return [0, ''];\n }\n if (rangeIndex === -1 || encodedData?.byteLength > totalBytes - chunkSize) {\n return [encodedData?.byteLength || 0, ''];\n }\n // Note the byte range is inclusive at both ends and zero based,\n // so the byteLength is the next index to fetch.\n return [encodedData?.byteLength || 0, chunkSize * (rangeIndex + 1) - 1];\n}\n","import type { Types } from '@cornerstonejs/core';\nimport { xhrRequest } from '../internal/index';\n// import rangeRequest from '../internal/rangeRequest';\nimport streamRequest from '../internal/streamRequest';\nimport rangeRequest from '../internal/rangeRequest';\nimport extractMultipart from './extractMultipart';\nimport { getImageQualityStatus } from './getImageQualityStatus';\nimport type { CornerstoneWadoRsLoaderOptions } from './loadImage';\n\nfunction getPixelData(\n uri: string,\n imageId: string,\n mediaType = 'application/octet-stream',\n options?: CornerstoneWadoRsLoaderOptions\n) {\n const { streamingData, retrieveOptions = {} as Types.RetrieveOptions } =\n options || {};\n const headers = {\n Accept: mediaType,\n };\n\n // Add urlArguments to the url for retrieving - allows accept and other\n // parameters to be added.\n let url = retrieveOptions.urlArguments\n ? `${uri}${uri.indexOf('?') === -1 ? '?' : '&'}${\n retrieveOptions.urlArguments\n }`\n : uri;\n\n // Replace the /frames/ part of the path with another path to choose\n // a different resource type.\n if (retrieveOptions.framesPath) {\n url = url.replace('/frames/', retrieveOptions.framesPath);\n }\n\n // Swap the streaming data out if a new instance starts.\n if (streamingData?.url !== url) {\n options.streamingData = { url };\n }\n\n if (\n (retrieveOptions as Types.RangeRetrieveOptions).rangeIndex !== undefined\n ) {\n return rangeRequest(url, imageId, headers, options);\n }\n\n // Use the streaming parser only when configured to do so\n if ((retrieveOptions as Types.StreamingRetrieveOptions).streaming) {\n return streamRequest(url, imageId, headers, options);\n }\n\n /**\n * Not progressively rendering, use regular xhr request.\n */\n const loadPromise = xhrRequest(url, imageId, headers);\n const { xhr } = loadPromise;\n\n return loadPromise.then(function (imageFrameAsArrayBuffer /* , xhr*/) {\n const contentType =\n xhr.getResponseHeader('Content-Type') || 'application/octet-stream';\n const extracted = extractMultipart(\n contentType,\n new Uint8Array(imageFrameAsArrayBuffer)\n );\n extracted.imageQualityStatus = getImageQualityStatus(retrieveOptions, true);\n return extracted;\n });\n}\n\nexport default getPixelData;\n","import {\n Enums,\n imageRetrievalPoolManager,\n utilities,\n} from '@cornerstonejs/core';\nimport { Enums as csCoreEnums, type Types } from '@cornerstonejs/core';\n\nimport createImage from '../createImage';\nimport getPixelData from './getPixelData';\nimport type { DICOMLoaderIImage, DICOMLoaderImageOptions } from '../../types';\n\nconst { ProgressiveIterator } = utilities;\nconst { ImageQualityStatus } = Enums;\nconst streamableTransferSyntaxes = new Set<string>([\n // Private HTJ2K\n '3.2.840.10008.1.2.4.96',\n // Released HTJ2K - only the RPCL one is definitely streamable.\n '1.2.840.10008.1.2.4.202',\n // HTJ2K lossy might be streamable, so try it. If it fails it is ok as it will\n // proceed and eventually work.\n '1.2.840.10008.1.2.4.203',\n]);\n\n/**\n * Helper method to extract the transfer-syntax from the response of the server.\n * @param {string} contentType The value of the content-type header as returned by the WADO-RS server.\n * @return The transfer-syntax as announced by the server, or Implicit Little Endian by default.\n */\nexport function getTransferSyntaxForContentType(contentType: string): string {\n const defaultTransferSyntax = '1.2.840.10008.1.2'; // Default is Implicit Little Endian.\n if (!contentType) {\n return defaultTransferSyntax;\n }\n\n // Browse through the content type parameters\n const parameters = contentType.split(';');\n const params: Record<string, string> = {};\n\n parameters.forEach((parameter) => {\n // Look for a transfer-syntax=XXXX pair\n const parameterValues = parameter.split('=');\n\n if (parameterValues.length !== 2) {\n return;\n }\n\n const value = parameterValues[1].trim().replace(/\"/g, '');\n\n params[parameterValues[0].trim()] = value;\n });\n\n // This is useful if the PACS doesn't respond with a syntax\n // in the content type.\n // http://dicom.nema.org/medical/dicom/current/output/chtml/part18/chapter_6.html#table_6.1.1.8-3b\n const defaultTransferSyntaxByType = {\n 'image/jpeg': '1.2.840.10008.1.2.4.50',\n 'image/x-dicom-rle': '1.2.840.10008.1.2.5',\n 'image/x-jls': '1.2.840.10008.1.2.4.80',\n 'image/jls': '1.2.840.10008.1.2.4.80',\n 'image/jll': '1.2.840.10008.1.2.4.70',\n 'image/jp2': '1.2.840.10008.1.2.4.90',\n 'image/jpx': '1.2.840.10008.1.2.4.92',\n // Temporary types, until ratified by DICOM committed - TODO\n 'image/jphc': '3.2.840.10008.1.2.4.96',\n 'image/jxl': '1.2.840.10008.1.2.4.140',\n };\n\n if (params['transfer-syntax']) {\n return params['transfer-syntax'];\n } else if (\n contentType &&\n !Object.keys(params).length &&\n defaultTransferSyntaxByType[contentType]\n ) {\n // dcm4che seems to be reporting the content type as just 'image/jp2'?\n return defaultTransferSyntaxByType[contentType];\n } else if (params.type && defaultTransferSyntaxByType[params.type]) {\n return defaultTransferSyntaxByType[params.type];\n } else if (defaultTransferSyntaxByType[contentType]) {\n return defaultTransferSyntaxByType[contentType];\n }\n\n return defaultTransferSyntax;\n}\n\nfunction getImageRetrievalPool() {\n return imageRetrievalPoolManager;\n}\n\nexport interface StreamingData {\n url: string;\n encodedData?: Uint8Array;\n // Some values used by instances of streaming data for range\n totalBytes?: number;\n chunkSize?: number;\n totalRanges?: number;\n rangesFetched?: number;\n}\n\nexport interface CornerstoneWadoRsLoaderOptions\n extends DICOMLoaderImageOptions {\n requestType?: csCoreEnums.RequestType;\n additionalDetails?: {\n imageId: string;\n };\n priority?: number;\n addToBeginning?: boolean;\n retrieveType?: string;\n transferSyntaxUID?: string;\n // Retrieve options are stored to provide sub-options for nested calls\n retrieveOptions?: Types.RangeRetrieveOptions;\n // Streaming data adds information about already streamed results.\n streamingData?: StreamingData;\n}\n\n// TODO: load bulk data items that we might need\n\n// Uncomment this on to test jpegls codec in OHIF\n// const mediaType = 'multipart/related; type=\"image/x-jls\"';\n// const mediaType = 'multipart/related; type=\"application/octet-stream\"; transfer-syntax=\"image/x-jls\"';\nconst mediaType =\n 'multipart/related; type=application/octet-stream; transfer-syntax=*';\n\nfunction loadImage(\n imageId: string,\n options: CornerstoneWadoRsLoaderOptions = {}\n): Types.IImageLoadObject {\n const imageRetrievalPool = getImageRetrievalPool();\n\n const start = new Date().getTime();\n\n const uncompressedIterator = new ProgressiveIterator<DICOMLoaderIImage>(\n 'decompress'\n );\n async function sendXHR(imageURI: string, imageId: string, mediaType: string) {\n uncompressedIterator.generate(async (it) => {\n // get the pixel data from the server\n const compressedIt = ProgressiveIterator.as(\n getPixelData(imageURI, imageId, mediaType, options)\n );\n let lastDecodeLevel = 10;\n for await (const result of compressedIt) {\n const {\n pixelData,\n imageQualityStatus = ImageQualityStatus.FULL_RESOLUTION,\n percentComplete,\n done = true,\n extractDone = true,\n } = result;\n const transferSyntax = getTransferSyntaxForContentType(\n result.contentType\n );\n if (!extractDone && !streamableTransferSyntaxes.has(transferSyntax)) {\n continue;\n }\n const decodeLevel =\n result.decodeLevel ??\n (imageQualityStatus === ImageQualityStatus.FULL_RESOLUTION\n ? 0\n : decodeLevelFromComplete(\n percentComplete,\n options.retrieveOptions?.decodeLevel\n ));\n if (!done && lastDecodeLevel <= decodeLevel) {\n // No point trying again yet\n continue;\n }\n\n try {\n const useOptions = {\n ...options,\n decodeLevel,\n };\n const image = (await createImage(\n imageId,\n pixelData,\n transferSyntax,\n useOptions\n )) as DICOMLoaderIImage;\n\n // add the loadTimeInMS property\n const end = new Date().getTime();\n\n image.loadTimeInMS = end - start;\n image.transferSyntaxUID = transferSyntax;\n image.imageQualityStatus = imageQualityStatus;\n // The iteration is done even if the image itself isn't done yet\n it.add(image, done);\n lastDecodeLevel = decodeLevel;\n } catch (e) {\n if (extractDone) {\n console.warn(\"Couldn't decode\", e);\n throw e;\n }\n }\n }\n });\n }\n\n const requestType =\n options.requestType || csCoreEnums.RequestType.Interaction;\n const additionalDetails = options.additionalDetails || { imageId };\n const priority = options.priority === undefined ? 5 : options.priority;\n const uri = imageId.substring(7);\n\n imageRetrievalPool.addRequest(\n sendXHR.bind(this, uri, imageId, mediaType),\n requestType,\n additionalDetails,\n priority\n );\n\n return {\n promise: uncompressedIterator.getDonePromise(),\n cancelFn: undefined,\n };\n}\n\n/** The decode level is based on how much of hte data is needed for\n * each level. It is a square function, so\n * level 4 only needs 1/25 of the data (eg (4+1)^2). Add 2% to ensure\n * there is enough space\n */\nfunction decodeLevelFromComplete(percent: number, retrieveDecodeLevel = 4) {\n const testSize = percent / 100 - 0.02;\n if (testSize > 1 / 4) {\n return Math.min(retrieveDecodeLevel, 0);\n }\n if (testSize > 1 / 16) {\n return Math.min(retrieveDecodeLevel, 1);\n }\n if (testSize > 1 / 64) {\n return Math.min(retrieveDecodeLevel, 2);\n }\n return Math.min(retrieveDecodeLevel, 3);\n}\n\nexport default loadImage;\n","import { metaData, registerImageLoader, type Types } from '@cornerstonejs/core';\nimport loadImage from './loadImage';\nimport { metaDataProvider } from './metaData';\n\nexport default function () {\n // register wadors scheme and metadata provider\n registerImageLoader('wadors', loadImage as unknown as Types.ImageLoaderFn);\n metaData.addProvider(metaDataProvider);\n}\n","import getNumberString from './metaData/getNumberString';\nimport getNumberValue from './metaData/getNumberValue';\nimport getNumberValues from './metaData/getNumberValues';\nimport getValue from './metaData/getValue';\nimport metaDataProvider from './metaData/metaDataProvider';\nimport findIndexOfString from './findIndexOfString';\nimport getPixelData from './getPixelData';\nimport metaDataManager from './metaDataManager';\nimport loadImage from './loadImage';\nimport register from './register';\n\nconst metaData = {\n getNumberString,\n getNumberValue,\n getNumberValues,\n getValue,\n metaDataProvider,\n};\n\nexport default {\n metaData,\n findIndexOfString,\n getPixelData,\n loadImage,\n metaDataManager,\n register,\n};\n","import wadouriRegister from './wadouri/register';\nimport wadorsRegister from './wadors/register';\n\n/**\n * Register the WADO-URI and WADO-RS image loaders and metaData providers\n * with an instance of Cornerstone Core.\n *\n * @param cornerstone The Cornerstone Core library to register the image loaders with\n */\nfunction registerLoaders(): void {\n wadorsRegister();\n wadouriRegister();\n}\n\nexport default registerLoaders;\n","import { setOptions } from './imageLoader/internal/index';\nimport type { LoaderOptions } from './types';\nimport registerLoaders from './imageLoader/registerLoaders';\nimport { getWebWorkerManager } from '@cornerstonejs/core';\n\nconst workerFn = () => {\n const instance = new Worker(\n new URL('./decodeImageFrameWorker.js', import.meta.url),\n { type: 'module' }\n );\n return instance;\n};\n\nfunction init(options: LoaderOptions): void {\n // setting options should happen first, since we use the options in the\n // cornerstone set\n // DO NOT CHANGE THE ORDER OF THESE TWO LINES!\n setOptions(options);\n registerLoaders();\n\n const workerManager = getWebWorkerManager();\n const maxWorkers = options?.maxWebWorkers || getReasonableWorkerCount();\n workerManager.registerWorker('dicomImageLoader', workerFn, {\n maxWorkerInstances: maxWorkers,\n });\n}\n\nfunction getReasonableWorkerCount(): number {\n if (typeof navigator !== 'undefined' && navigator.hardwareConcurrency) {\n // Use half of the available cores, but at least 1\n return Math.max(1, Math.floor(navigator.hardwareConcurrency / 2));\n }\n // Default to 1 if we can't determine the number of cores\n return 1;\n}\n\nexport default init;\n","import type { Types } from '@cornerstonejs/core';\n\nfunction isJPEGBaseline8BitColor(\n imageFrame: Types.IImageFrame,\n transferSyntax: string\n): boolean {\n /** @todo check as any */\n transferSyntax = transferSyntax || imageFrame.transferSyntax;\n\n if (\n imageFrame.bitsAllocated === 8 &&\n transferSyntax === '1.2.840.10008.1.2.4.50' &&\n (imageFrame.samplesPerPixel === 3 || imageFrame.samplesPerPixel === 4)\n ) {\n return true;\n }\n}\n\nexport default isJPEGBaseline8BitColor;\n","import {\n convertRGBColorByPixel,\n convertRGBColorByPlane,\n convertYBRFullByPixel,\n convertYBRFullByPlane,\n convertPALETTECOLOR,\n} from './colorSpaceConverters/index';\n\nimport { default as wadouri } from './wadouri/index';\nimport { default as wadors } from './wadors/index';\nimport { default as init } from '../init';\nimport { default as convertColorSpace } from './convertColorSpace';\nimport { default as createImage } from './createImage';\nimport { default as decodeJPEGBaseline8BitColor } from './decodeJPEGBaseline8BitColor';\nimport { default as getImageFrame } from './getImageFrame';\nimport { default as getMinMax } from '../shared/getMinMax';\nimport { default as isColorImage } from '../shared/isColorImage';\nimport { default as isJPEGBaseline8BitColor } from './isJPEGBaseline8BitColor';\nimport { default as getPixelData } from './wadors/getPixelData';\nimport { internal } from './internal/index';\n\nconst cornerstoneDICOMImageLoader = {\n convertRGBColorByPixel,\n convertRGBColorByPlane,\n convertYBRFullByPixel,\n convertYBRFullByPlane,\n convertPALETTECOLOR,\n wadouri,\n wadors,\n init,\n convertColorSpace,\n createImage,\n decodeJPEGBaseline8BitColor,\n getImageFrame,\n getPixelData,\n getMinMax,\n isColorImage,\n isJPEGBaseline8BitColor,\n internal,\n};\n\nexport {\n convertRGBColorByPixel,\n convertRGBColorByPlane,\n convertYBRFullByPixel,\n convertYBRFullByPlane,\n convertPALETTECOLOR,\n wadouri,\n wadors,\n init,\n convertColorSpace,\n createImage,\n decodeJPEGBaseline8BitColor,\n getImageFrame,\n getPixelData,\n getMinMax,\n isColorImage,\n isJPEGBaseline8BitColor,\n internal,\n};\n\nexport default cornerstoneDICOMImageLoader;\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__464__","__WEBPACK_EXTERNAL_MODULE__713__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","m","d","definition","key","o","Object","defineProperty","enumerable","get","u","chunkId","g","globalThis","Function","e","window","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","length","i","Error","replace","p","b","baseURI","self","href","imageFrame","colorBuffer","useRGBA","numPixels","rgbIndex","bufferIndex","set","rIndex","gIndex","bIndex","ybrIndex","y","cb","cr","yIndex","cbIndex","crIndex","convertLUTto8Bit","lut","shift","numEntries","cleanedLUT","Uint8ClampedArray","fetchPaletteData","color","fallback","data","Promise","resolve","result","metaData","imageId","then","columns","rows","pixelData","all","rData","gData","bData","len","palIndex","start","redPaletteColorLookupTableDescriptor","rDataCleaned","gDataCleaned","bDataCleaned","getLutDescriptor","dataSet","tag","elements","uint16","getLutData","lutDataSet","lutDescriptor","lutData","byteArray","dataOffset","imagePixelModule","samplesPerPixel","photometricInterpretation","string","bitsAllocated","bitsStored","highBit","pixelRepresentation","planarConfiguration","pixelAspectRatio","smallestPixelValue","largestPixelValue","int16","populateSmallestLargestPixelValues","x00281101","greenPaletteColorLookupTableDescriptor","bluePaletteColorLookupTableDescriptor","numLutEntries","lutBitsAllocated","x00281201","redPaletteColorLookupTableData","greenPaletteColorLookupTableData","bluePaletteColorLookupTableData","populatePaletteColorLut","getLUT","numLUTEntries","firstValueMapped","id","numBitsPerEntry","lutSequence","items","luts","push","sopClassUID","rescaleIntercept","floatString","rescaleSlope","minStoredPixelValue","getMinStoredPixelValue","x00283000","minimumLength","values","valueAsString","split","parseFloat","firstColonIndex","indexOf","url","substring","frameIndex","frame","frameStr","parseInt","scheme","pixelDataFrame","options","open","xhr","beforeSend","beforeProcessing","response","imageCreated","strict","setOptions","newOptions","assign","getOptions","defaultHeaders","params","errorInterceptor","error","request","status","XMLHttpRequest","promise","reject","beforeSendHeaders","responseType","headers","keys","forEach","setRequestHeader","deferred","onloadstart","event","eventData","triggerEvent","eventTarget","onloadend","onreadystatechange","readyState","catch","onprogress","oProgress","loaded","total","percentComplete","lengthComputable","Math","round","onerror","onabort","send","checkToken","token","endIndex","str","offset","uint","Uint8Array","j","charCodeAt","stringToUint8Array","ImageQualityStatus","Enums","extractMultipart","contentType","imageFrameAsArrayBuffer","isPartial","imageQualityStatus","SUBRESOLUTION","FULL_RESOLUTION","tokenIndex","responseHeaders","boundary","multipartContentType","findIndexOfString","header","String","fromCharCode","uint8ArrayToString","substr","findBoundary","trim","findContentType","extractDone","slice","getImageQualityStatus","retrieveOptions","done","ProgressiveIterator","utilities","streamRequest","globalOptions","streamingData","minChunkSize","loadIterator","generate","async","iterator","fetch","signal","responseReader","body","getReader","totalBytes","Number","readDone","encodedData","lastSize","read","appendChunk","byteLength","extracted","detail","add","err","console","getNextPromise","existing","chunk","newDataArray","internal","xhrRequest","parsePartialByteArray","pixelDataSet","dicomParser","untilTag","x7fe00010","warn","log","fragments","totalLength","fragment","position","fixFragments","dataSetFromPartialContent","loadRequest","metadata","uri","fileTotalLength","fetchMore","fetchOptions","_options","fetchedLength","lengthToFetch","arrayBuffer","byteRange","byteArrayToAppend","combinedByteArray","getFrameInformation","PerFrameFunctionalGroupsSequence","SharedFunctionalGroupsSequence","frameNumber","shared","map","it","perFrame","getMultiframeInformation","otherAttributtes","x52009230","x52009229","otherElements","NumberOfFrames","intString","loadedDataSets","_get","_isMultiframeDataset","numberOfFrames","generateMultiframeWADOURIs","listWADOURIs","retrieveMultiframeDataset","frameParameterIndex","retrieveFrameParameterIndex","multiframeURI","isMultiframeDataset","cacheSizeInBytes","promises","getInfo","numberOfDataSetsCached","isLoaded","load","cacheCount","loadDICOMPromise","dicomPart10AsArrayBuffer","partialContent","isPartialContent","ArrayBuffer","flags","action","cacheInfo","unload","purge","includes","multiframeDataSet","multiframeDataset","newElements","clonedDataset","create","combineFrameInstanceDataset","update","loadedDataSet","isNMReconstructable","imageSubType","getImageTypeSubItemFromDataset","index","imageType","subTypes","extractOrientationFromDataset","imageOrientationPatient","getNumberValues","x00209116","modality","x00540022","extractOrientationFromNMMultiframeDataset","extractPositionFromDataset","imagePositionPatient","x00209113","extractPositionFromNMMultiframeDataset","extractSpacingFromDataset","pixelSpacing","x00289110","extractSliceThicknessFromDataset","sliceThickness","x00180050","getInstanceModule","metaDataProvider","types","t","capitalizedData","capitalizeTag","charAt","toUpperCase","instanceModuleNames","getUSEnhancedRegions","sequence","item","physicalDeltaX","double","physicalDeltaY","physicalUnitsXDirection","physicalUnitsYDirection","regionLocationMinY0","regionLocationMaxY1","regionLocationMinX0","regionLocationMaxX1","referencePixelX0","int32","referencePixelY0","referencePhysicalPixelValueY","referencePhysicalPixelValueX","regionSpatialFormat","regionDataType","regionFlags","transducerFrequency","type","MetadataModules","Array","isArray","parsedImageId","parseImageId","MULTIFRAME","multiframeData","multiframeInfo","PerFrameFunctionalInformation","SharedFunctionalInformation","getDirectFrameInformation","dataSetCacheManager","metadataForDataset","GENERAL_STUDY","studyDescription","studyDate","studyTime","accessionNumber","GENERAL_SERIES","seriesInstanceUID","seriesNumber","studyInstanceUID","seriesDate","seriesTime","acquisitionDate","acquisitionTime","GENERAL_IMAGE","sopInstanceUID","instanceNumber","lossyImageCompression","lossyImageCompressionRatio","lossyImageCompressionMethod","PATIENT","patientID","patientName","PATIENT_STUDY","patientAge","patientSize","patientSex","patientWeight","NM_MULTIFRAME_GEOMETRY","IMAGE_PLANE","columnPixelSpacing","rowPixelSpacing","rowCosines","columnCosines","frameOfReferenceUID","sliceLocation","CINE","frameTime","IMAGE_PIXEL","getImagePixelModule","VOI_LUT","modalityLUTOutputPixelRepresentation","getModalityLUTOutputPixelRepresentation","windowCenter","windowWidth","voiLUTSequence","getLUTs","x00283010","MODALITY_LUT","rescaleType","modalityLUTSequence","SOP_COMMON","PET_ISOTOPE","radiopharmaceuticalInfo","x00540016","firstRadiopharmaceuticalInfoDataSet","radiopharmaceuticalStartTime","radionuclideTotalDose","radionuclideHalfLife","OVERLAY_PLANE","overlays","overlayGroup","groupStr","toString","k","byte_as_int","x","description","label","roiArea","roiMean","roiStandardDeviation","getOverlayPlaneModule","transferSyntaxUID","PET_SERIES","correctedImage","units","decayCorrection","PET_IMAGE","frameReferenceTime","actualFrameDuration","ULTRASOUND_ENHANCED_REGION","CALIBRATION","sequenceOfUltrasoundRegions","files","file","remove","getEncapsulatedImageFrame","basicOffsetTable","readEncapsulatedImageFrame","framesAreFragmented","createJPEGBasicOffsetTable","byteStream","ByteStream","byteArrayParser","readSequenceItem","seek","fragmentZeroPosition","byteOffset","buffer","isBitSet","byte","bitPos","frameOffset","pixelsPerFrame","floor","pixelDataElement","x7fe00008","pixelDataOffset","unpackBinaryFrame","fileIndex","fileManager","fileReader","FileReader","onload","target","readAsArrayBuffer","encapsulatedPixelData","getUncompressedImageFrame","storedPixelData","storedPixel","min","max","convertRGB","convertRGBColorByPixel","convertRGBColorByPlane","convertColorSpace","convertPALETTECOLOR","y1","y2","convertYBRFull422ByPixel","convertYBRFullByPixel","convertYBRFullByPlane","convertYBRFull","arrayBufferToString","binary","decodeURIComponent","escape","_error","URIError","binaryToString","apply","canvas","Date","getTime","imgBlob","Blob","readAsBinaryString","img","Image","height","width","context","getContext","drawImage","imageData","getImageData","end","decodeTimeInMS","minMax","getMinMax","pixelDataLength","btoa","processDecodeTask","transferSyntax","srcOptions","decodeConfig","loader","webWorkerManager","getWebWorkerManager","priority","transferPixelData","executeTask","requestType","decodeJPEGBaseline8BitColor","photoMetricInterpretation","lastImageIdDrawn","setPixelDataType","TypedArray","pixelDataType","isInteger","Uint16Array","Int8Array","Int16Array","Float32Array","getPixelDataTypeFromMinMax","typedArray","preScale","enabled","createElement","getImageFrame","decodeLevel","allowFloatRendering","canRenderFloatTextures","scalingParameters","modalityLutModule","generalSeriesModule","suvFactor","suvbw","getScalingParameters","decodePromise","decodeImageFrame","isColorImage","isColorImageFn","alreadyTyped","targetBuffer","rawOffset","rawLength","imageFrameLength","typedArrayConstructors","TypedArrayConstructor","imagePlaneModule","voiLutModule","sopCommonModule","calibrationModule","endsWith","ceil","isColorConversionRequired","createImageData","removeAFromRGBA","voxelManager","scalarData","numberOfComponents","image","dataType","constructor","name","calibration","intercept","slope","invert","minPixelValue","maxPixelValue","sizeInBytes","voiLUTFunction","floatPixelData","rgba","getPixelData","getCanvas","sopClassUid","ctx","arr","putImageData","modalityLUT","voiLUT","minVoi","maxVoi","loadImageFromPromise","dataSetPromise","sharedCacheKey","callbacks","imageLoadObject","cancelFn","loadEnd","imagePromise","createImage","decache","addDecache","loadTimeInMS","totalTimeInMS","imageDoneCallback","getLoaderForScheme","loadFileRequest","loadImage","schemeLoader","loadImageFromDataSet","registerImageLoader","register","element","defaultValue","Value","getValue","imageIdToURI","colonIndex","getTagValue","justElement","filter","rest","metadataByImageURI","multiframeMetadataByImageURI","_retrieveMultiframeMetadataImageURI","imageURI","lastSlashIdx","imageIdFrameless","isMultiframe","cachedMetadata","retrievedMetadata","firstFrameMetadata","combined","instance","newInstance","entries","combineFrameInstance","isNMModality","getImageTypeSubItemFromMetadata","extractOrientationFromMetadata","detectorInformationSequence","extractOrientationFromNMMultiframeMetadata","extractPositionFromMetadata","extractPositionFromNMMultiframeMetadata","getFirstNumberValue","getSequenceItems","getTransferSyntax","retrieveMultiframeMetadataImageId","metaDataManager","getNumberValue","spacingBetweenSlices","usingDefaultValues","IMAGE_URL","isVideo","imageUrl","thumbnail","rendered","getImageUrlModule","cineRate","getCineModule","radiopharmaceuticalStartDateTime","rangeRequest","chunkSize","attr","rangesFetched","rangeIndex","getByteRange","range","Range","responseArrayBuffer","responseTypedArray","newByteArray","contentRange","MAX_SAFE_INTEGER","fetchRangeAndAppend","doneAllBytes","extract","mediaType","Accept","urlArguments","framesPath","streaming","loadPromise","getResponseHeader","streamableTransferSyntaxes","Set","getTransferSyntaxForContentType","defaultTransferSyntax","parameters","parameter","parameterValues","defaultTransferSyntaxByType","decodeLevelFromComplete","percent","retrieveDecodeLevel","testSize","imageRetrievalPool","imageRetrievalPoolManager","uncompressedIterator","csCoreEnums","additionalDetails","addRequest","compressedIt","as","lastDecodeLevel","has","useOptions","bind","getDonePromise","getNumberString","wadorsRegister","wadouriRegister","workerFn","Worker","URL","registerLoaders","workerManager","maxWorkers","maxWebWorkers","navigator","hardwareConcurrency","getReasonableWorkerCount","registerWorker","maxWorkerInstances","wadouri","wadors","init","isJPEGBaseline8BitColor"],"sourceRoot":""}
|