!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("konva"),require("jszip"),require("magic-wand-tool")):"function"==typeof define&&define.amd?define(["konva","jszip","konmagic-wand-tool"],t):"object"==typeof exports?exports.dwv=t(require("konva"),require("jszip"),require("magic-wand-tool")):e.dwv=t(e.Konva,e.JSZip,e.MagicWand)}(this,(function(e,t,n){return function(){"use strict";var i={654:function(e){e.exports=t},944:function(t){t.exports=e},324:function(e){e.exports=n}},r={};function o(e){var t=r[e];if(void 0!==t)return t.exports;var n=r[e]={exports:{}};return i[e](n,n.exports,o),n.exports}o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,{a:t}),t},o.d=function(e,t){for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};return function(){o.r(a),o.d(a,{App:function(){return Wi},AppOptions:function(){return zi},BLACK:function(){return p},ChangeSegmentColourCommand:function(){return ji},ColourMap:function(){return h},DataElement:function(){return Ie},DeleteSegmentCommand:function(){return Xi},DicomCode:function(){return Ot},DicomParser:function(){return Ge},DicomWriter:function(){return Tt},DrawController:function(){return vn},DrawDetails:function(){return gn},DrawLayer:function(){return In},DrawMeta:function(){return hn},Geometry:function(){return tt},Image:function(){return zt},Index:function(){return e},LayerGroup:function(){return wn},MaskFactory:function(){return Gt},MaskSegment:function(){return xt},MaskSegmentHelper:function(){return Yi},MaskSegmentViewHelper:function(){return Zi},Matrix33:function(){return w},Orientation:function(){return ye},OverlayData:function(){return di},PlaneHelper:function(){return Zt},Point:function(){return x},Point2D:function(){return A},Point3D:function(){return b},RGB:function(){return m},RescaleSlopeAndIntercept:function(){return Xe},Scalar2D:function(){return _i},Scalar3D:function(){return Ki},ScrollWheel:function(){return hi},Size:function(){return je},Spacing:function(){return et},Tag:function(){return se},TagValueExtractor:function(){return ut},ToolConfig:function(){return Hi},ToolboxController:function(){return Qn},Vector3D:function(){return T},View:function(){return jt},ViewConfig:function(){return ki},ViewController:function(){return _t},ViewLayer:function(){return rn},WindowLevel:function(){return r},WriterRule:function(){return gt},addTagsToDictionary:function(){return W},buildMultipart:function(){return H},createImage:function(){return kt},createMaskImage:function(){return Ht},createView:function(){return Xt},customUI:function(){return Jt},decoderScripts:function(){return Yn},defaultPresets:function(){return s},defaults:function(){return Ii},getDefaultDicomSegJson:function(){return Nt},getDwvVersion:function(){return Te},getElementsFromJSONTags:function(){return wt},getEllipseIndices:function(){return Ei},getLayerDetailsFromEvent:function(){return Ln},getMousePoint:function(){return tn},getOrientationName:function(){return Ae},getPixelDataTag:function(){return Se},getReverseOrientation:function(){return Oe},getTagFromKey:function(){return le},getTouchPoints:function(){return en},getTypedArray:function(){return Ue},getUID:function(){return pt},hasDicomPrefix:function(){return Le},i18n:function(){return gi},isEqualRgb:function(){return f},labToUintLab:function(){return D},logger:function(){return i},luts:function(){return g},precisionRound:function(){return Q},srgbToCielab:function(){return v},toolList:function(){return Vi}});class e{#e;constructor(e){if(!e||void 0===e)throw new Error("Cannot create index with no values.");if(0===e.length)throw new Error("Cannot create index with empty values.");if(!e.every((function(e){return!isNaN(e)})))throw new Error("Cannot create index with non number values.");this.#e=e}get(e){return this.#e[e]}length(){return this.#e.length}toString(){return"("+this.#e.toString()+")"}getValues(){return this.#e.slice()}canCompare(e){return!!e&&this.length()===e.length()}equals(e){if(!this.canCompare(e))return!1;for(let t=0,n=this.length();t=this.length())throw new Error("Non valid dimension for toStringId.");let t="";for(let n=0;nr&&(r=i+1);const o=new Array(r);o.fill(0);for(let e=0;ethis.#u?this.#l:e*this.#d+this.#S}}class c{#g;#m;#r;#p=0;#f=!0;constructor(e,t,n){if(this.#g=e,t){const e=this.#g.getLength();this.#p=e/2}else this.#p=0;this.#f=n}getVoiLut(){return this.#m}getModalityLut(){return this.#g}setVoiLut(e){if(this.#m=e,this.#m.setSignedOffset(this.#g.getRSI().getSlope()*this.#p),this.#f){const e=this.#g.getLength();this.#r=new Uint8ClampedArray(e);for(let t=0;t255?255:t})),green:u((function(e){const t=256/3;let n=0;return e>=t&&(n=3*(e-t),n>255)?255:n})),blue:u((function(e){const t=256/3;let n=0;return e>=2*t&&(n=3*(e-2*t),n>255)?255:n}))},hot_iron:{red:[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],green:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,255],blue:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,255]},pet:{red:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,171,173,175,177,179,181,183,185,187,189,191,193,195,197,199,201,203,205,207,209,211,213,215,217,219,221,223,225,227,229,231,233,235,237,239,241,243,245,247,249,251,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],green:[0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,105,107,109,111,113,115,117,119,121,123,125,128,126,124,122,120,118,116,114,112,110,108,106,104,102,100,98,96,94,92,90,88,86,84,82,80,78,76,74,72,70,68,66,64,63,61,59,57,55,53,51,49,47,45,43,41,39,37,35,33,31,29,27,25,23,21,19,17,15,13,11,9,7,5,3,1,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,255],blue:[0,1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,105,107,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,141,143,145,147,149,151,153,155,157,159,161,163,165,167,169,171,173,175,177,179,181,183,185,187,189,191,193,195,197,199,201,203,205,207,209,211,213,215,217,219,221,223,225,227,229,231,233,235,237,239,241,243,245,247,249,251,253,255,252,248,244,240,236,232,228,224,220,216,212,208,204,200,196,192,188,184,180,176,172,168,164,160,156,152,148,144,140,136,132,128,124,120,116,112,108,104,100,96,92,88,84,80,76,72,68,64,60,56,52,48,44,40,36,32,28,24,20,16,12,8,4,0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,85,89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,170,174,178,182,186,190,194,198,202,206,210,214,218,222,226,230,234,238,242,246,250,255]},hot_metal_blue:{red:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,9,12,15,18,21,24,26,29,32,35,38,41,44,47,50,52,55,57,59,62,64,66,69,71,74,76,78,81,83,85,88,90,93,96,99,102,105,108,111,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,166,169,172,175,178,181,184,187,190,194,198,201,205,209,213,217,221,224,228,232,236,240,244,247,251,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],green:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,6,8,9,11,13,15,17,19,21,23,24,26,28,30,32,34,36,38,40,41,43,45,47,49,51,53,55,56,58,60,62,64,66,68,70,72,73,75,77,79,81,83,85,87,88,90,92,94,96,98,100,102,104,105,107,109,111,113,115,117,119,120,122,124,126,128,130,132,134,136,137,139,141,143,145,147,149,151,152,154,156,158,160,162,164,166,168,169,171,173,175,177,179,181,183,184,186,188,190,192,194,196,198,200,201,203,205,207,209,211,213,215,216,218,220,222,224,226,228,229,231,233,235,237,239,240,242,244,246,248,250,251,253,255],blue:[0,2,4,6,8,10,12,14,16,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,117,119,121,123,125,127,129,131,133,135,137,139,141,143,145,147,149,151,153,155,157,159,161,163,165,167,169,171,173,175,177,179,181,183,184,186,188,190,192,194,196,198,200,197,194,191,188,185,182,179,176,174,171,168,165,162,159,156,153,150,144,138,132,126,121,115,109,103,97,91,85,79,74,68,62,56,50,47,44,41,38,35,32,29,26,24,21,18,15,12,9,6,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,9,12,15,18,21,24,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68,71,74,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,126,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,176,179,182,185,188,191,194,197,200,203,206,210,213,216,219,223,226,229,232,236,239,242,245,249,252,255]},pet_20step:{red:[0,0,0,0,0,0,0,0,0,0,0,0,0,96,96,96,96,96,96,96,96,96,96,96,96,96,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,80,80,80,80,80,80,80,80,80,80,80,80,80,96,96,96,96,96,96,96,96,96,96,96,96,96,112,112,112,112,112,112,112,112,112,112,112,112,112,128,128,128,128,128,128,128,128,128,128,128,128,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,80,80,80,80,80,80,80,80,80,80,80,80,80,64,64,64,64,64,64,64,64,64,64,64,64,224,224,224,224,224,224,224,224,224,224,224,224,224,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,192,192,192,192,192,192,192,192,192,192,192,192,192,176,176,176,176,176,176,176,176,176,176,176,176,176,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],green:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,80,80,80,80,80,80,80,80,80,80,80,80,80,96,96,96,96,96,96,96,96,96,96,96,96,96,112,112,112,112,112,112,112,112,112,112,112,112,112,128,128,128,128,128,128,128,128,128,128,128,128,96,96,96,96,96,96,96,96,96,96,96,96,96,144,144,144,144,144,144,144,144,144,144,144,144,144,192,192,192,192,192,192,192,192,192,192,192,192,192,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,208,208,208,208,208,208,208,208,208,208,208,208,208,176,176,176,176,176,176,176,176,176,176,176,176,176,144,144,144,144,144,144,144,144,144,144,144,144,96,96,96,96,96,96,96,96,96,96,96,96,96,48,48,48,48,48,48,48,48,48,48,48,48,48,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255],blue:[0,0,0,0,0,0,0,0,0,0,0,0,0,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,80,112,112,112,112,112,112,112,112,112,112,112,112,128,128,128,128,128,128,128,128,128,128,128,128,128,176,176,176,176,176,176,176,176,176,176,176,176,176,192,192,192,192,192,192,192,192,192,192,192,192,192,224,224,224,224,224,224,224,224,224,224,224,224,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,80,80,80,80,80,80,80,80,80,80,80,80,80,64,64,64,64,64,64,64,64,64,64,64,64,80,80,80,80,80,80,80,80,80,80,80,80,80,96,96,96,96,96,96,96,96,96,96,96,96,96,64,64,64,64,64,64,64,64,64,64,64,64,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255]}};class m{r;g;b;constructor(e,t,n){this.r=e,this.g=t,this.b=n}}const p={r:0,g:0,b:0};function f(e,t){return null!==e&&null!==t&&void 0!==e&&void 0!==t&&e.r===t.r&&e.g===t.g&&e.b===t.b}function y(e){return function(e){return n=e,.001172549*(t={r:parseInt(n.substring(1,3),16),g:parseInt(n.substring(3,5),16),b:parseInt(n.substring(5,7),16)}).r+.002301961*t.g+447059e-9*t.b<.5;var t,n}(e)?"#fff":"#000"}function D(e){return{l:655.35*e.l,a:257*e.a+32896,b:257*e.b+32896}}const C={x:95.0489,y:100,z:108.884};function v(e){return function(e){function t(e){let t=null;return t=e>.008856452?Math.pow(e,.333333333):7.787037037*e+.137931034,t}const n=C,i=t(e.y/n.y);return{l:116*i-16,a:500*(t(e.x/n.x)-i),b:200*(i-t(e.z/n.z))}}(function(e){function t(e){let t=null;return t=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4),t}const n=t(e.r/255),i=t(e.g/255),r=t(e.b/255);return{x:100*(.4124*n+.3576*i+.1805*r),y:100*(.2126*n+.7152*i+.0722*r),z:100*(.0193*n+.1192*i+.9505*r)}}(e))}function I(e){const t={Yellow:"#ffff00",Red:"#ff0000",White:"#ffffff",Green:"#008000",Blue:"#0000ff",Lime:"#00ff00",Fuchsia:"#ff00ff",Black:"#000000"};let n="#ffff00";return void 0!==t[e]&&(n=t[e]),n}class T{#y;#D;#C;constructor(e,t,n){this.#y=e,this.#D=t,this.#C=n}getX(){return this.#y}getY(){return this.#D}getZ(){return this.#C}equals(e){return null!==e&&this.#y===e.getX()&&this.#D===e.getY()&&this.#C===e.getZ()}toString(){return"("+this.#y+", "+this.#D+", "+this.#C+")"}norm(){return Math.sqrt(this.#y*this.#y+this.#D*this.#D+this.#C*this.#C)}crossProduct(e){return new T(this.#D*e.getZ()-e.getY()*this.#C,this.#C*e.getX()-e.getZ()*this.#y,this.#y*e.getY()-e.getX()*this.#D)}dotProduct(e){return this.#y*e.getX()+this.#D*e.getY()+this.#C*e.getZ()}isCodirectional(e){return this.dotProduct(e)>0}}Number.EPSILON;const L=1e-4;function P(e,t,n){return void 0===n&&(n=Number.EPSILON),Math.abs(e-t)0?1:-1;for(let t=0;t<3;++t)t===n.index?e.push(1*i):e.push(0)}return new w(e)}getThirdColMajorDirection(){return this.getColAbsMax(2).index}}function O(){return new w([1,0,0,0,1,0,0,0,1])}class A{#y;#D;constructor(e,t){this.#y=e,this.#D=t}getX(){return this.#y}getY(){return this.#D}equals(e){return null!=e&&this.#y===e.getX()&&this.#D===e.getY()}toString(){return"("+this.#y+", "+this.#D+")"}}class b{#y;#D;#C;constructor(e,t,n){this.#y=e,this.#D=t,this.#C=n}getX(){return this.#y}getY(){return this.#D}getZ(){return this.#C}equals(e){return null!==e&&this.#y===e.getX()&&this.#D===e.getY()&&this.#C===e.getZ()}isSimilar(e,t){return null!==e&&P(this.#y,e.getX(),t)&&P(this.#D,e.getY(),t)&&P(this.#C,e.getZ(),t)}toString(){return"("+this.#y+", "+this.#D+", "+this.#C+")"}getDistance(e){return Math.sqrt(this.#I(e))}#I(e){const t=this.#y-e.getX(),n=this.#D-e.getY(),i=this.#C-e.getZ();return t*t+n*n+i*i}getClosest(e){let t=0,n=this.#I(e[t]);for(let i=0;i0?0|n:0;return e.substring(i,i+t.length)===t}function F(e,t){return null!=e&&null!=t&&e.substring(e.length-t.length)===t}function E(e){const t=[];if(null==e)return t;const n=/{(\w+)}/g;let i=n.exec(e);for(;i;)t.push(i[1]),i=n.exec(e);return t}function q(e,t){let n="";if(null==e)return n;if(n=e,null==t)return n;const i=E(e);for(let e=0;e=e.length)&&(n=0),(void 0===i||i<=n||i>e.length)&&(i=e.length);for(let r=n;ro;t--,o++)r=n[o],n[o]=n[t],n[t]=r}class pe{#w;#O=!0;#A=function(){return new Int8Array(new Int16Array([1]).buffer)[0]>0}();#b;#x;constructor(e,t){this.#w=e,void 0!==t&&(this.#O=t),this.#b=this.#O!==this.#A,this.#x=new DataView(e)}readUint16(e){return this.#x.getUint16(e,this.#O)}readInt16(e){return this.#x.getInt16(e,this.#O)}readUint32(e){return this.#x.getUint32(e,this.#O)}readBigUint64(e){return this.#x.getBigUint64(e,this.#O)}readInt32(e){return this.#x.getInt32(e,this.#O)}readBigInt64(e){return this.#x.getBigInt64(e,this.#O)}readFloat32(e){return this.#x.getFloat32(e,this.#O)}readFloat64(e){return this.#x.getFloat64(e,this.#O)}readBinaryArray(e,t){const n=new Uint8Array(this.#w,e,t),i=8*n.length,r=new Uint8Array(i);let o=0,a=0;for(let e=0;ea&&t.getX()>t.getY()&&t.getX()>t.getZ())n+=i,t=new T(0,t.getY(),t.getZ());else if(t.getY()>a&&t.getY()>t.getX()&&t.getY()>t.getZ())n+=r,t=new T(t.getX(),0,t.getZ());else{if(!(t.getZ()>a&&t.getZ()>t.getX()&&t.getZ()>t.getY()))break;n+=o,t=new T(t.getX(),t.getY(),0)}return n}function ve(e){let t;if(void 0!==e&&6===e.length){const n=new T(e[0],e[1],e[2]),i=new T(e[3],e[4],e[5]),r=n.crossProduct(i);t=new w([n.getX(),i.getX(),r.getX(),n.getY(),i.getY(),r.getY(),n.getZ(),i.getZ(),r.getZ()])}return t}class Ie{vr;value;tag;vl;undefinedLength;startOffset;endOffset;items;constructor(e){this.vr=e}}function Te(){return"0.33.0-beta.40"}function Le(e){return!(e.byteLength<132)&&"DICM"===new Uint8Array(e,128,4).reduce((function(e,t){return e+String.fromCharCode(t)}),"")}const Pe=String.fromCharCode("u200B");class we{decode(e){let t="";for(let n=0,i=e.length;n2^"+e+").")}}return r}function Me(e,t){return t?8:j(e)?12:8}const Qe="00280008",Be="00280100",Ve="00280103",Ne="7FE00010";class Ge{#R={};#F;#E=new we;#q=this.#E;#U(e){return this.#E.decode(e)}#M(e){return this.#q.decode(e)}getDefaultCharacterSet(){return this.#F}setDefaultCharacterSet(e){this.#F=e}setDecoderCharacterSet(e){this.#q=new TextDecoder(e)}getDicomElements(){return this.#R}#Q(e,t){const n=e.readHex(t);t+=Uint16Array.BYTES_PER_ELEMENT;const i=e.readHex(t);return t+=Uint16Array.BYTES_PER_ELEMENT,{tag:new se(n,i),endOffset:t}}#B(e,t,n){const i={};let r=this.#V(e,t,n);if(t=r.endOffset,de(r.tag))return{data:i,endOffset:r.endOffset,isSeqDelim:!0};if(i[r.tag.getKey()]={tag:r.tag,vr:"NONE",vl:r.vl,undefinedLength:r.undefinedLength},r.undefinedLength){let o=!1;for(;!o;)r=this.#V(e,t,n),t=r.endOffset,o="FFFEE00D"===r.tag.getKey(),o||(i[r.tag.getKey()]=r)}else{const o=t;for(t-=r.vl;t8&&"OB"===s&&(i.warn("Reading DICOM pixel data with bitsAllocated>8 and OB VR, treating as OW"),e.vr="OW"),c=[],1===r)c.push(t.readBinaryArray(l,a));else if(8===r)0===n?c.push(t.readUint8Array(l,a)):c.push(t.readInt8Array(l,a));else{if(16!==r)throw new Error("Unsupported bits allocated: "+r);0===n?c.push(t.readUint16Array(l,a)):c.push(t.readInt16Array(l,a))}else if(void 0!==u)if("Uint8"===u)c=t.readUint8Array(l,a);else if("Uint16"===u)c=t.readUint16Array(l,a),"O"!==s[0]&&(c=Array.from(c));else if("Uint32"===u)c=t.readUint32Array(l,a),"O"!==s[0]&&(c=Array.from(c));else if("Uint64"===u)c=t.readUint64Array(l,a);else if("Int16"===u)c=Array.from(t.readInt16Array(l,a));else if("Int32"===u)c=Array.from(t.readInt32Array(l,a));else if("Int64"===u)c=t.readInt64Array(l,a);else if("Float32"===u)c=Array.from(t.readFloat32Array(l,a));else if("Float64"===u)c=Array.from(t.readFloat64Array(l,a));else{if("string"!==u)throw new Error("Unknown VR type: "+u);{const e=t.readUint8Array(l,a);c=_(s)?this.#M(e):this.#U(e),c=function(e){let t=e;const n=e.length-1;return e[n]===Pe&&(t=e.substring(0,n)),t=t.trim(),t}(c).split("\\")}}else if("xx"===s)c=Array.from(t.readUint16Array(l,a));else if("ox"===s)c=8===r?0===n?Array.from(t.readUint8Array(l,a)):Array.from(t.readInt8Array(l,a)):0===n?Array.from(t.readUint16Array(l,a)):Array.from(t.readInt16Array(l,a));else if("xs"===s)c=0===n?Array.from(t.readUint16Array(l,a)):Array.from(t.readInt16Array(l,a));else if("AT"===s){const e=t.readUint16Array(l,a);c=[];for(let t=0,n=e.length;t=65&&r<=90&&o>=65&&o<=90);let s=null;if(n===t)s=a?$:ee;else{if(a)throw new Error("Not a valid DICOM file (no magic DICM word foundand implicit VR big endian detected)");s=te}const l=new Ie("UI");return l.tag=new se("0002","0010"),l.value=[s],l.vl=l.value[0].length,l.startOffset=e.startOffset,l.endOffset=l.startOffset+l.vl,l}(r);this.#R[e.tag.getKey()]=e,n=e.value[0],t=0}if(!function(e){return e===$||e===ee||e===te||Re(e)||Fe(e)||Ee(e)||qe(e)}(n))throw new Error("Unsupported DICOM transfer syntax: '"+n+"' ("+function(e){let t="Unknown";return void 0!==J[e]&&(t=J[e]),t}(n)+")");let l=!1;for(be(n)&&(l=!0),xe(n)&&(a=new pe(e,!1));t1&&t.length>e){const n=t.length/e,i=[];let o=0;for(let r=0;r{if(void 0===this.#H[e.type])return;const t=this.#H[e.type].slice();for(let n=0;n2?e:0})));let c=o.indexToOffset(l);void 0===i&&(i=!1);let u=null;u=i?function(e){return t.getRescaledValueAtOffset(e)}:function(e){return t.getValueAtOffset(e)};const d=o.get(0),S=o.get(1),h=o.get(2);let g=o.getDimSize(2);const m=t.getNumberOfComponents(),p=1===t.getPlanarConfiguration(),f=function(e,t,n,i,r,o,a,s){return 1===m?He(e,t,n,i,r,o,a,s):3===m?function(e,t,n,i,r,o,a,s,l){const c=[];return l?(c.push(He(e,t,n,i,r,o,a,s)),c.push(He(e,t+n*i,n,i,r,o,a,s)),c.push(He(e,t+2*n*i,n,i,r,o,a,s))):(i*=3,o*=3,c.push(He(e,t,n,i,r,o,a,s)),c.push(He(e,t+1,n,i,r,o,a,s)),c.push(He(e,t+2,n,i,r,o,a,s))),{next:function(){const e=c[0].next(),t=c[1].next(),n=c[2].next();return e.done?{done:!0,index:n.index}:{value:[e.value,t.value,n.value],done:!1,index:[e.index,t.index,n.index]}}}}(e,3*t,n,i,r,o,a,s,p):void 0};let y=null;if(r&&void 0!==r){const e=r.getColAbsMax(0),t=r.getColAbsMax(2),n=!1,i=!1;let o=null;if(2===t.index)o=d*S,y=0===e.index?f(u,c,o,1,d,d,n,i):f(u,c,o,d,S,1,n,i);else if(0===t.index)o=h*S,y=1===e.index?f(u,c,o,d,S,g,n,i):f(u,c,o,g,h,d,n,i);else{if(1!==t.index)throw new Error("Unknown direction: "+t.index);o=h*d,y=0===e.index?f(u,c,o,1,d,g,n,i):f(u,c,o,g,h,1,n,i)}}else if(1===t.getNumberOfComponents())y=function(e,t,n,i){void 0===i&&(i=1);let r=t;return{next:function(){if(r=e[i+1].index&&++i;const t={value:e[i].colour,done:!1,index:n};return++n,t}return{done:!0,index:t}}}}class Xe{#d;#z;constructor(e,t){this.#d=e,this.#z=t}getSlope(){return this.#d}getIntercept(){return this.#z}apply(e){return e*this.#d+this.#z}equals(e){return null!=e&&this.getSlope()===e.getSlope()&&this.getIntercept()===e.getIntercept()}isID(){return 1===this.getSlope()&&0===this.getIntercept()}}class je{#e;constructor(e){if(!e||void 0===e)throw new Error("Cannot create size with no values.");if(0===e.length)throw new Error("Cannot create size with empty values.");if(!e.every((function(e){return!isNaN(e)&&0!==e})))throw new Error("Cannot create size with non number or zero values.");this.#e=e}get(e){return this.#e[e]}length(){return this.#e.length}toString(){return"("+this.#e.toString()+")"}getValues(){return this.#e.slice()}moreThanOne(e){return this.length()>=e+1&&1!==this.get(e)}canScroll3D(e){let t=2;return void 0!==e&&(t=e.getThirdColMajorDirection()),this.moreThanOne(t)}canScroll(e){let t=this.canScroll3D(e);for(let e=3;ethis.length())return null;if(void 0===t)t=0;else if(t<0||t>e)throw new Error("Invalid start value for getDimSize");let n=1;for(let i=t;in-1)throw new Error("Wrong input dir value: "+t[e]);for(let n=0;n=0&&ithis.length()-1)throw new Error("Invalid start value for indexToOffset");let n=0;for(let i=t;i0;--e)r=this.getDimSize(e),n[e]=Math.floor(i/r),i-=n[e]*r;return n[0]=i,new e(n)}get2D(){return{x:this.get(0),y:this.get(1)}}}class Ze{min;max;mean;stdDev;median;p25;p75;constructor(e,t,n,i){this.min=e,this.max=t,this.mean=n,this.stdDev=i}}function _e(e,t){return function(e){return null!=e&&(e.includes("median")||e.includes("p25")||e.includes("p75"))}(t)?function(e){const t=Ke(e);return e.sort((function(e,t){return e-t})),t.median=Je(e,.5),t.p25=Je(e,.25),t.p75=Je(e,.75),t}(e):Ke(e)}function Ke(e){let t=e[0],n=t,i=0,r=0,o=0;const a=e.length;for(let s=0;sn&&(n=o),i+=o,r+=o*o;const s=i/a;let l=r/a-s*s;l<0&&(l=0);const c=Math.sqrt(l);return new Ze(t,n,s,c)}function Je(e,t){if(0===e.length)throw new Error("Empty array provided for percentile calculation.");if(t<0||t>1)throw new Error("Invalid ratio provided for percentile calculation: "+t);if(0===t)return e[0];if(1===t)return e[e.length-1];const n=(e.length-1)*t,i=Math.floor(n),r=e[i];return r+(e[i+1]-r)*(n-i)}function $e(){return Math.random().toString(36).substring(2,15)}class et{#e;constructor(e){if(!e||void 0===e)throw new Error("Cannot create spacing with no values.");if(0===e.length)throw new Error("Cannot create spacing with empty values.");if(!e.every((function(e){return!isNaN(e)&&0!==e})))throw new Error("Cannot create spacing with non number or zero values.");this.#e=e}get(e){return this.#e[e]}length(){return this.#e.length}toString(){return"("+this.#e.toString()+")"}getValues(){return this.#e.slice()}equals(e){if(!e)return!1;const t=this.length();if(t!==e.length())return!1;for(let n=0;nL&&i.warn("Varying slice spacing, value: "+r+" (mean: "+n.mean+", min: "+n.min+", max: "+n.max+", stdDev: "+n.stdDev+")"),r}(this.#W);if(void 0!==e&&this.#X.get(2)!==e){i.trace("Using geometric spacing "+e+" instead of tag spacing "+this.#X.get(2));const t=this.#X.getValues();t[2]=e,this.#X=new et(t)}}getSpacing(e){this.#K&&(this.#J(),this.#K=!1);let t=this.#X;if(e&&void 0!==e){let n=nt([this.#X.get(0),this.#X.get(1),this.#X.get(2)],e);n=n.map(Math.abs),t=new et(n)}return t}getRealSpacing(){return this.getSpacing(this.#_.getInverse().asOneAndZeros())}getOrientation(){return this.#_}getSliceIndex(e,t){let n=this.#W;void 0!==t&&(n=this.#j[t]);const i=e.getClosest(n),r=n[i],o=e.minus(r);return new T(this.#_.get(0,2),this.#_.get(1,2),this.#_.get(2,2)).isCodirectional(o)?i+1:i}appendOrigin(e,t,n){const i=function(t){return t.equals(e)};if(void 0!==n){if(void 0!==this.#j[n].find(i))throw new Error("Cannot append same time origin twice");this.#j[n].splice(t,0,e)}if(void 0===n||n===this.#Z){if(void 0!==this.#W.find(i))throw new Error("Cannot append same origin twice");this.#K=!0,this.#W.splice(t,0,e);const n=this.#Y.getValues();n[2]+=1,this.#Y=new je(n)}}appendFrame(e,t){this.#j[t]=[e];const n=this.#Y.getValues(),i=this.#X.getValues();4===n.length?n[3]+=1:(n.push(2),i.push(1)),this.#Y=new je(n),this.#X=new et(i)}toString(){return"Origin: "+this.getOrigin()+", Size: "+this.getSize()+", Spacing: "+this.getSpacing()+", Orientation: "+this.getOrientation()}equals(e){return null!==e&&this.getOrigin().equals(e.getOrigin())&&this.getSize().equals(e.getSize())&&this.getSpacing().equals(e.getSpacing())}isInBounds(e){return this.isIndexInBounds(this.worldToIndex(e))}isIndexInBounds(e,t){return this.getSize().isInBounds(e,t)}indexToWorld(e){const t=this.getSpacing(),n=new b(e.get(0)*t.get(0),e.get(1)*t.get(1),e.get(2)*t.get(2)),i=this.getOrientation().multiplyPoint3D(n),r=e.getValues(),o=this.getOrigin();return r[0]=o.getX()+i.getX(),r[1]=o.getY()+i.getY(),r[2]=o.getZ()+i.getZ(),new x(r)}pointToWorld(e){const t=this.getSpacing(),n=new b(e.getX()*t.get(0),e.getY()*t.get(1),e.getZ()*t.get(2)),i=this.getOrientation().multiplyPoint3D(n),r=this.getOrigin();return new b(r.getX()+i.getX(),r.getY()+i.getY(),r.getZ()+i.getZ())}worldToIndex(t){const n=this.getOrigin(),i=new b(t.get(0)-n.getX(),t.get(1)-n.getY(),t.get(2)-n.getZ()),r=this.getOrientation().getInverse().multiplyPoint3D(i),o=t.getValues(),a=this.getSpacing();return o[0]=Math.round(r.getX()/a.get(0)),o[1]=Math.round(r.getY()/a.get(1)),o[2]=Math.round(r.getZ()/a.get(2)),new e(o)}worldToPoint(e){const t=this.getOrigin(),n=new b(e.get(0)-t.getX(),e.get(1)-t.getY(),e.get(2)-t.getZ()),i=this.getOrientation().getInverse().multiplyPoint3D(n),r=e.getValues(),o=this.getSpacing();return r[0]=i.getX()/o.get(0),r[1]=i.getY()/o.get(1),r[2]=i.getZ()/o.get(2),new b(r[0],r[1],r[2])}}function nt(e,t){return t.getInverse().multiplyArray3D(e)}function it(e,t){return t.multiplyArray3D(e)}function rt(e){const t=e["00280010"];if(void 0===t)throw new Error("Missing DICOM image number of rows");if(0===t.value.length)throw new Error("Empty DICOM image number of rows");const n=e["00280011"];if(void 0===n)throw new Error("Missing DICOM image number of columns");if(0===n.value.length)throw new Error("Empty DICOM image number of columns");return[n.value[0],t.value[0]]}function ot(e){if(void 0===e)return;if(1!==e.value.length)return;const t=e.value[0];let n=4,i=6;return 10===t.length&&(n=5,i=8),{year:parseInt(t.substring(0,4),10),monthIndex:t.length>=n+2?parseInt(t.substring(n,n+2),10)-1:0,day:t.length===i+2?parseInt(t.substring(i,i+2),10):0}}function at(e){if(void 0===e)return;if(1!==e.value.length)return;const t=e.value[0],n=parseInt(t.substring(0,2),10),i=t.length>=4?parseInt(t.substring(2,4),10):0,r=t.length>=6?parseInt(t.substring(4,6),10):0,o=t.length>=8?t.substring(7,10):0;return{hours:n,minutes:i,seconds:r,milliseconds:0===o?0:parseInt(o,10)*Math.pow(10,3-o.length)}}function st(e){return("0"+e).slice(-2)}function lt(e){if(void 0===e["00280030"])return null;const t=e["00280030"],n=[parseFloat(t.value[1]),parseFloat(t.value[0])];return void 0!==e["00180050"]?n.push(parseFloat(e["00180050"].value[0])):void 0!==e["00180088"]&&n.push(parseFloat(e["00180088"].value[0])),new et(n)}function ct(e,t,n){let i="";if(void 0===e)i+=" "+t+" is undefined,";else if(0===e.value.length)i+=" "+t+" is empty,";else if(void 0!==n)for(let r=0;r=9?at({value:[t.substring(8)]}):void 0}}(S);h=e.date,g=e.time}void 0===g&&(g={hours:0,minutes:0,seconds:0,milliseconds:0}),s=new Date(h.year,h.monthIndex,h.day,g.hours,g.minutes,g.seconds,g.milliseconds)}const c=at(e["00080031"]);let u=new Date(r.year,r.monthIndex,r.day,c.hours,c.minutes,c.seconds,c.milliseconds);const d=e["00080022"],S=e["00080032"];if(void 0!==d&&void 0!==S){const t=ot(d),r=at(S),o=new Date(t.year,t.monthIndex,t.day,r.hours,r.minutes,r.seconds,r.milliseconds);if(u>o){const s="Series date/time is after Aquisition date/time (diff="+(u.getTime()-o.getTime()).toString()+"ms) ";i.debug(s);let l=0;const c="FrameReferenceTime (00541300)",d=e["00541300"];n+=ct(d,c),void 0!==d&&(l=d.value[0]);let S=0;const h="ActualFrameDuration (0018,1242)",g=e["00181242"];if(n+=ct(g,h),void 0!==g&&(S=g.value[0]),l>0&&S>0){S/=1e3,l/=1e3;const e=Math.log(2)/a,n=e*S,i=1/e*Math.log(n/(1-Math.exp(-n)))-l;u=new Date(t.year,t.monthIndex,t.day,r.hours,r.minutes,r.seconds+i,r.milliseconds)}}}let h;if(void 0!==u&&void 0!==s&&void 0!==o&&void 0!==a){const e=(u.getTime()-s.getTime())/1e3;h=o*Math.pow(2,-e/a)}return{value:h,warning:n}}(e);n+=a.warning;const s={};return 0!==n.length?s.warning="Cannot calculate PET SUV:"+n:s.value=1e3*t/a.value,s}(e);this.#ee=t.value,this.#$=t.warning}return this.#$}create(e,t,n){const o=rt(e),a=[o[0],o[1],1],s=e["00280008"];if(void 0!==s){const e=parseInt(s.value[0],10);e>1&&a.push(e)}const l=new je(a),c=function(e){let t=1,n=1;const r=["00280030","00181164","00182010","00280034"];for(let i=0;iparseFloat(e))))),n}(e),y=new b(p[0],p[1],p[2]),D=(new ut).getTime(e),C=new tt(y,l,c,f,D);let v;const I=e["00080018"];void 0!==I&&(v=I.value[0]);let T=1;const L=e["00280002"];void 0!==L&&(T=L.value[0]);const P=l.getTotalSize()*T;if(P!==t.length){if(i.warn("Badly sized pixel buffer: "+t.length+" != "+P),!(P>8};o=t.value.map(e),a=n.value.map(e),s=r.value.map(e)}}else if(8===l.value[2]){i.info("Scaling 16bits color lut since the lut descriptor is 8.");let e=t.value.slice(0);o=Array.from(new Uint8Array(e.buffer)),e=n.value.slice(0),a=Array.from(new Uint8Array(e.buffer)),e=r.value.slice(0),s=Array.from(new Uint8Array(e.buffer))}g.palette={red:o,green:a,blue:s}}const z=e["00082144"];return void 0!==z&&(q.RecommendedDisplayFrameRate=parseInt(z.value[0],10)),w.setMeta(q),w}}class St{#O=!0;#x;constructor(e,t){void 0!==t&&(this.#O=t),this.#x=new DataView(e)}writeUint8(e,t){return this.#x.setUint8(e,t),e+Uint8Array.BYTES_PER_ELEMENT}writeInt8(e,t){return this.#x.setInt8(e,t),e+Int8Array.BYTES_PER_ELEMENT}writeUint16(e,t){return this.#x.setUint16(e,t,this.#O),e+Uint16Array.BYTES_PER_ELEMENT}writeInt16(e,t){return this.#x.setInt16(e,t,this.#O),e+Int16Array.BYTES_PER_ELEMENT}writeUint32(e,t){return this.#x.setUint32(e,t,this.#O),e+Uint32Array.BYTES_PER_ELEMENT}writeUint64(e,t){return this.#x.setBigUint64(e,t,this.#O),e+BigUint64Array.BYTES_PER_ELEMENT}writeInt32(e,t){return this.#x.setInt32(e,t,this.#O),e+Int32Array.BYTES_PER_ELEMENT}writeInt64(e,t){return this.#x.setBigInt64(e,t,this.#O),e+BigInt64Array.BYTES_PER_ELEMENT}writeFloat32(e,t){return this.#x.setFloat32(e,t,this.#O),e+Float32Array.BYTES_PER_ELEMENT}writeFloat64(e,t){return this.#x.setFloat64(e,t,this.#O),e+Float64Array.BYTES_PER_ELEMENT}writeHex(e,t){const n=parseInt(t,16);return this.#x.setUint16(e,n,this.#O),e+Uint16Array.BYTES_PER_ELEMENT}writeBinaryArray(e,t){if(t.length%8!=0)throw new Error("Cannot write boolean array as binary.");let n=null,i=null;for(let r=0,o=t.length;r1){let t="";for(let n=0;n1&&(o=function(e){const t=e.length,n=e[0].length;if(void 0===n)return e;const i=t*n,r=new e[0].constructor(i);for(let i=0;i.206896552?Math.pow(e,3):.128418549*e-.017712903,t}const n=C,i=(e.l+16)/116;return{x:n.x*t(i+e.a/500),y:n.y*t(i),z:n.z*t(i-e.b/200)}}(e))}({l:.001525902*(n={l:i[0],a:i[1],b:i[2]}).l,a:.003891051*n.a-128,b:.003891051*n.b-128});t.displayRGBValue=r}var n;if(void 0===e["00620003"])throw new Error("Missing Segmented Property Category Code Sequence.");if(t.propertyCategoryCode=At(e["00620003"].value[0]),void 0===e["0062000F"])throw new Error("Missing Segmented Property Type Code Sequence.");return t.propertyTypeCode=At(e["0062000F"].value[0]),void 0!==e["00620020"]&&(t.trackingId=e["00620020"].value[0],t.trackingUid=e["00620021"].value[0]),t}function Ft(e){let t=e.algorithmType;void 0===t&&(t="MANUAL");const n={SegmentNumber:e.number,SegmentLabel:e.label,SegmentAlgorithmType:t};if("MANUAL"!==t&&void 0!==e.algorithmName&&(n.SegmentAlgorithmName=e.algorithmName),e.displayRGBValue){const t=D(v(e.displayRGBValue));n.RecommendedDisplayCIELabValue=[Math.round(t.l),Math.round(t.a),Math.round(t.b)]}else n.RecommendedDisplayGrayscaleValue=e.displayValue;return e.propertyCategoryCode&&(n.SegmentedPropertyCategoryCodeSequence={value:[bt(e.propertyCategoryCode)]}),e.propertyTypeCode&&(n.SegmentedPropertyTypeCodeSequence={value:[bt(e.propertyTypeCode)]}),e.trackingId&&(n.TrackingID=e.trackingId,n.TrackingUID=e.trackingUid),n}class Et{dimIndex;imagePosPat;derivationImages;refSegmentNumber;imageOrientationPatient;spacing;constructor(e,t,n,i){this.dimIndex=e,this.imagePosPat=t,this.derivationImages=n,this.refSegmentNumber=i}}function qt(e){const t=[];if(void 0!==e["00089124"]){const n=e["00089124"].value;for(let e=0;eL;return t&&(t=e>.001,t?(t=e>.01,t||i.warn("Using larger+ real world epsilon in SEG pos pat adding")):i.warn("Using larger real world epsilon in SEG pos pat adding")),t},E=[];E.push(C[0]);let q=0;for(let t=1;ts)throw new Error("Test distance is increasing when adding intermediate pos pats");E.push(C[t])}const U=E.length,M=new tt(x[0],o,S,O),Q=["0"];for(let e=1;e=0;--i){const a=Number.parseInt(o[i],10);m.push(h[r][a]);const s=e.getGeometry().getOrigins()[a],l=[s.getX(),s.getY(),s.getZ()],c={dimIndex:[t,o.length-i],imagePosPat:l,refSegmentNumber:t};if(void 0!==n){const e=n.getGeometry().worldToIndex(new x([s.getX(),s.getY(),s.getZ()]));c.derivationImages=[{sourceImages:[{referencedSOPInstanceUID:n.getImageUid(e),referencedSOPClassUID:n.getMeta().SOPClassUID}]}],p.push({ReferencedSOPInstanceUID:n.getImageUid(e),ReferencedSOPClassUID:n.getMeta().SOPClassUID})}g.push(c)}}o.NumberOfFrames=m.length.toString();const f=[];for(const e of g)f.push(Ut(e));if(o.PerFrameFunctionalGroupsSequence={value:f},void 0!==n){const e=[];e.push({ReferencedInstanceSequence:{value:p},SeriesInstanceUID:n.getMeta().SeriesInstanceUID}),o.ReferencedSeriesSequence={value:e}}void 0!==r&&function(e,t){const n=Object.keys(t);for(const r of n)void 0!==e[r]&&i.trace("Overwritting tag: "+r),e[r]=t[r]}(o,r);const y=wt(o),D=s.getDimSize(2),C=m.length*D/8,v=new Ie("OB");return v.tag=new se("7FE0","0010"),v.vl=C,v.value=m,y["7FE00010"]=v,y}}function kt(e){return(new dt).create(e,e["7FE00010"].value[0],1)}function Ht(e){return(new Gt).create(e,e["7FE00010"].value[0])}class zt{#me;#w;#pe;#t=new Xe(1,0);#fe=null;#ye=!0;#De=!0;#Ce="MONOCHROME2";#ve=0;#Ie;#Te={};#Le=null;#Pe=null;#we=null;#Oe=new ke;constructor(e,t,n){this.#me=e,this.#w=t,this.#pe=n,this.#Ie=this.#w.length/this.#me.getSize().getTotalSize()}getImageUid(e){let t=this.#pe[0];return 1!==this.#pe.length&&void 0!==e&&(t=this.#pe[this.getSecondaryOffset(e)]),t}containsImageUids(e){return function(e,t){if(null===e||null===t||void 0===e||void 0===t)return!1;if(0===e.length||0===t.length||t.length>e.length)return!1;for(const n of t)if(!e.includes(n))return!1;return!0}(this.#pe,e)}getGeometry(){return this.#me}getBuffer(){return this.#w}canQuantify(){return 1===this.getNumberOfComponents()}canWindowLevel(){return this.isMonochrome()}isMonochrome(){return null!==this.getPhotometricInterpretation().match(/MONOCHROME/)}canScroll(e){const t=this.getGeometry().getSize();let n=1;return void 0!==this.#Te.numberOfFiles&&(n=this.#Te.numberOfFiles),t.canScroll(e)||1!==n}#Ae(){return this.#me.getSize().getTotalSize(2)}getSecondaryOffset(e){return this.#me.getSize().indexToOffset(e,2)}getRescaleSlopeAndIntercept(e){let t=this.#t;if(!this.isConstantRSI()){if(void 0===e)throw new Error("Cannot get non constant RSI with empty slice index.");const n=this.getSecondaryOffset(e);void 0!==this.#fe[n]?t=this.#fe[n]:i.warn("undefined non constant rsi at "+n)}return t}#be(e){return this.#fe[e]}setRescaleSlopeAndIntercept(e,t){if(this.#ye=this.#ye&&e.isID(),this.#De){if(!this.#t.equals(e))if(void 0===t)this.#t=e;else{this.#De=!1,this.#fe=[];for(let e=0,t=this.#Ae();e=this.#Te.numberOfFiles?i.warn("Ignoring frame at index "+t+" (size: "+this.#Te.numberOfFiles+")"):(this.#w.set(e,r*t),this.appendFrame(t,new b(0,0,0)))}appendFrame(e,t){this.#me.appendFrame(t,e),this.#Re({type:"appendframe"})}getDataRange(){return this.#Le||(this.#Le=this.calculateDataRange()),this.#Le}getRescaledDataRange(){return this.#Pe||(this.#Pe=this.calculateRescaledDataRange()),this.#Pe}getHistogram(){if(!this.#we){const e=this.calculateHistogram();this.#Le=e.dataRange,this.#Pe=e.rescaledDataRange,this.#we=e.histogram}return this.#we}addEventListener(e,t){this.#Oe.add(e,t)}removeEventListener(e,t){this.#Oe.remove(e,t)}#Re=e=>{this.#Oe.fireEvent(e)};setAtOffsets(e,t){let n,i;if("number"==typeof t){if(1!==this.#Ie)throw new Error("Number of components is not 1 for setting single value.");n=[t]}else if(void 0!==t.r&&void 0!==t.g&&void 0!==t.b){if(3!==this.#Ie)throw new Error("Number of components is not 3 for setting RGB value.");n=[t.r,t.g,t.b]}for(let t=0,r=e.length;t=3&&(r=i.getDimSize(3));for(let i=0;it&&(t=n),nn?t:n}}{let e=this.getRescaledValueAtOffset(0),t=e,n=0;const i=this.getGeometry().getSize();let r=i.getTotalSize();3===i.length()&&(r=i.getDimSize(3));for(let i=0;it&&(t=n),ni&&(i=r),ra&&(a=s),s{const t=this.getCurrentIndex();if(3===t.length()){const n=t.getValues();n.push(0),this.setCurrentIndex(new e(n))}}))}getImage(){return this.#Fe}setImage(e){this.#Fe=e}getOrientation(){return this.#_}setOrientation(e){this.#_=e}init(){this.setInitialIndex()}setInitialIndex(){const t=this.#Fe.getGeometry().getSize(),n=new Array(t.length());n.fill(0),n[0]=Math.floor(t.get(0)/2),n[1]=Math.floor(t.get(1)/2),n[2]=Math.floor(t.get(2)/2),this.setCurrentIndex(new e(n),!0)}getPlaybackMilliseconds(e){return e||(e=10),Math.round(1e3/e)}#Ve=function(e,t){return 255};getAlphaFunction(){return this.#Ve}setAlphaFunction(e){this.#Ve=e,this.#Re({type:"alphafuncchange"})}#Ne(){if(this.#Ue&&void 0!==this.#qe[this.#Ue]&&void 0!==this.#qe[this.#Ue].perslice&&!0===this.#qe[this.#Ue].perslice){this.getCurrentIndex()||this.setInitialIndex();const e=this.getCurrentIndex(),t=this.#Fe.getSecondaryOffset(e),n=this.#qe[this.#Ue].wl[t];this.setWindowLevel(n,this.#Ue,!0)}if(void 0===this.#Me&&this.setWindowLevelPresetById(0,!0),void 0===this.#De||this.#Fe.isConstantRSI()!==this.#De){let e,t;this.#De=this.#Fe.isConstantRSI(),this.#De?(e=this.#Fe.getRescaleSlopeAndIntercept(),t=!0):(e=new Xe(1,0),t=!1);const i=new n(e,this.#Fe.getMeta().BitsStored);this.#Ee=new c(i,this.#Fe.getMeta().IsSigned,t)}const e=this.#Ee.getVoiLut();let t;if(void 0!==e&&(t=e.getWindowLevel()),void 0===e||!this.#Me.equals(t)){const e=new l(this.#Me);this.#Ee.setVoiLut(e)}return this.#Ee}getWindowPresets(){return this.#qe}getWindowPresetsNames(){return Object.keys(this.#qe)}setWindowPresets(e){this.#qe=e}addWindowPresets(e){const t=Object.keys(e);let n=null;for(let i=0;i{this.#Oe.fireEvent(e)};getWindowLevelMinMax(){const e=this.getImage().getRescaledDataRange(),t=e.min;let n=e.max-t;return n<1&&(i.warn("Zero or negative window width, defaulting to one."),n=1),new r(t+n/2,n)}setWindowLevelMinMax(){const e=this.getWindowLevelMinMax();this.setWindowLevel(e,"minmax")}generateImageData(e,t){void 0===t&&(this.getCurrentIndex()||this.setInitialIndex(),t=this.getCurrentIndex());const n=this.getImage(),r=!n.isConstantRSI(),o=We(n,t,r,this.getOrientation()),a=n.getPhotometricInterpretation();switch(a){case"MONOCHROME1":case"MONOCHROME2":!function(e,t,n,i,r){let o=0,a=0,s=t.next();for(;!s.done;)a=i.getValue(s.value),e.data[o]=r.red[a],e.data[o+1]=r.green[a],e.data[o+2]=r.blue[a],e.data[o+3]=n(s.value,s.index),o+=4,s=t.next()}(e,o,this.getAlphaFunction(),this.#Ne(),this.#Ge());break;case"PALETTE COLOR":!function(e,t,n,r,o){const a=function(e){return e>>8};o&&i.info("Scaling 16bits data to 8bits.");let s=0,l=0,c=t.next();for(;!c.done;)l=c.value,o?(e.data[s]=a(r.red[l]),e.data[s+1]=a(r.green[l]),e.data[s+2]=a(r.blue[l])):(e.data[s]=r.red[l],e.data[s+1]=r.green[l],e.data[s+2]=r.blue[l]),e.data[s+3]=n(l,c.index),s+=4,c=t.next()}(e,o,this.getAlphaFunction(),this.#Ge(),16===n.getMeta().BitsStored);break;case"RGB":!function(e,t,n){let i=0,r=t.next();for(;!r.done;)e.data[i]=r.value[0],e.data[i+1]=r.value[1],e.data[i+2]=r.value[2],e.data[i+3]=n(r.value,r.index),i+=4,r=t.next()}(e,o,this.getAlphaFunction());break;case"YBR_FULL":!function(e,t,n){let i=0,r=null,o=t.next();for(;!o.done;)a=o.value[0],s=o.value[1],r={r:a+1.402*((l=o.value[2])-128),g:a-.34414*(s-128)-.71414*(l-128),b:a+1.772*(s-128)},e.data[i]=r.r,e.data[i+1]=r.g,e.data[i+2]=r.b,e.data[i+3]=n(o.value,o.index),i+=4,o=t.next();var a,s,l}(e,o,this.getAlphaFunction());break;default:throw new Error("Unsupported photometric interpretation: "+a)}}getScrollIndex(){let e=null;const t=this.getOrientation();return e=void 0!==t?t.getThirdColMajorDirection():2,e}}class Zt{#X;#ke;#He;#ze;constructor(e,t,n){this.#X=e,this.#ke=t,this.#He=n,this.#ze=function(e,t){let n=e.asOneAndZeros().multiply(t);return e.asOneAndZeros().getAbs().equals(fe().getAbs())&&(n=n.getAbs()),n}(t,n)}getOffset3DFromPlaneOffset(e){const t=new T(e.x,e.y,0),n=this.getTargetDeOrientedVector3D(t);return new T(n.getX()*this.#X.get(0),n.getY()*this.#X.get(1),n.getZ()*this.#X.get(2))}getPlaneOffsetFromOffset3D(e){const t=new T(e.x/this.#X.get(0),e.y/this.#X.get(1),e.z/this.#X.get(2)),n=this.getTargetOrientedVector3D(t);return{x:n.getX(),y:n.getY()}}getTargetOrientedVector3D(e){let t=e;return void 0!==this.#ze&&(t=this.#ze.getInverse().multiplyVector3D(e)),t}getTargetDeOrientedVector3D(e){let t=e;return void 0!==this.#ze&&(t=this.#ze.multiplyVector3D(e)),t}getTargetDeOrientedPoint3D(e){let t=e;return void 0!==this.#ze&&(t=this.#ze.multiplyPoint3D(e)),t}getImageOrientedVector3D(e){let t=e;if(void 0!==this.#He){const n=it([e.getX(),e.getY(),e.getZ()],this.#He);t=new T(n[0],n[1],n[2])}return t}getImageOrientedPoint3D(e){let t=e;if(void 0!==this.#He){const n=it([e.getX(),e.getY(),e.getZ()],this.#He);t=new b(n[0],n[1],n[2])}return t}getImageDeOrientedVector3D(e){let t=e;if(void 0!==this.#He){const n=nt([e.getX(),e.getY(),e.getZ()],this.#He);t=new T(n[0],n[1],n[2])}return t}getImageDeOrientedPoint3D(e){let t=e;if(void 0!==this.#He){const n=nt([e.getX(),e.getY(),e.getZ()],this.#He);t=new b(n[0],n[1],n[2])}return t}getTargetOrientedPositiveXYZ(e){const t=nt([e.x,e.y,e.z],this.#ze);return{x:t[0],y:t[1],z:t[2]}}getScrollIndex(){let e=null;return e=void 0!==this.#He?this.#He.getThirdColMajorDirection():2,e}getNativeScrollIndex(){let e=null;return e=void 0!==this.#ke?this.#ke.getThirdColMajorDirection():2,e}}class _t{#x;#We;#Ye;#Qe="plain";#Xe;#je=!1;constructor(e,t){if(void 0===e.getImage())throw new Error("View does not have an image, cannot setup controller");this.#x=e,this.#We=t,this.#Ye=new Zt(e.getImage().getGeometry().getRealSpacing(),e.getImage().getGeometry().getOrientation(),e.getOrientation()),"SEG"===e.getImage().getMeta().Modality&&(this.#je=!0)}#Oe=new ke;getPlaneHelper(){return this.#Ye}isMask(){return this.#je}initialise(){this.setWindowLevelPresetById(0),this.setCurrentPosition(this.getPositionFromPlanePoint(new A(0,0)))}getModality(){return this.#x.getImage().getMeta().Modality}getWindowLevelPresetsNames(){return this.#x.getWindowPresetsNames()}addWindowLevelPresets(e){return this.#x.addWindowPresets(e)}setWindowLevelPreset(e){this.#x.setWindowLevelPreset(e)}setWindowLevelPresetById(e){this.#x.setWindowLevelPresetById(e)}isPlaying(){return void 0!==this.#Xe}getCurrentPosition(){return this.#x.getCurrentPosition()}getCurrentIndex(){return this.#x.getCurrentIndex()}getCurrentOrientedIndex(){let t=this.#x.getCurrentIndex();if(void 0!==this.#x.getOrientation()){const n=this.#Ye.getImageDeOrientedVector3D(new T(t.get(0),t.get(1),t.get(2)));t=new e([n.getX(),n.getY(),n.getZ()])}return t}getScrollIndex(){return this.#x.getScrollIndex()}getCurrentScrollIndexValue(){return this.#x.getCurrentIndex().get(this.#x.getScrollIndex())}getOrigin(e){return this.#x.getOrigin(e)}getCurrentScrollPosition(){const e=this.#x.getScrollIndex();return this.#x.getCurrentPosition().get(e)}generateImageData(e,t){this.#x.generateImageData(e,t)}setImage(e,t){this.#x.setImage(e),this.#We=t}get2DSpacing(){return this.#x.getImage().getGeometry().getSpacing(this.#x.getOrientation()).get2D()}getRescaledImageValue(e){const t=this.#x.getImage();if(!t.canQuantify())return;const n=t.getGeometry(),i=n.worldToIndex(e);let r;return n.isIndexInBounds(i)&&(r=t.getRescaledValueAtIndex(i)),r}getPixelUnit(){return this.#x.getImage().getMeta().pixelUnit}getImageRegionValues(t,n){let i=this.#x.getImage();const r=this.#x.getOrientation();let o=this.getCurrentIndex(),a=!0;if(!r.equals(O())){const t=ze(We(i,o,a,r)),n=i.getGeometry().getSize(r).getValues();n[2]=1;const s=new je(n),l=i.getGeometry().getSpacing(r).getValues();l[2]=1;const c=new et(l),u=new b(0,0,0),d=new tt(u,s,c);i=new zt(d,t),o=new e([0,0,0]),a=!1}const s=function(e,t,n,i,r){if(1!==e.getNumberOfComponents())throw new Error("Unsupported number of components for region iterator: "+e.getNumberOfComponents());void 0===n&&(n=!1);let o=null;o=n?function(t){return e.getRescaledValueAtOffset(t)}:function(t){return e.getValueAtOffset(t)};const a=e.getGeometry().getSize();void 0===i&&(i=new A(0,0)),void 0===r&&(r=new A(a.get(0)-1,a.get(1)));const s=a.indexToOffset(t.getWithNew2D(i.getX(),i.getY())),l=a.indexToOffset(t.getWithNew2D(r.getX(),r.getY()-1)),c=Math.max(1,r.getX()-i.getX());return function(e,t,n,i,r,o){let a=t,s=0;return{next:function(){if(a{let t=!1;if(t=r?this.incrementScrollIndex():this.incrementIndex(3),!t){const t=this.getCurrentIndex().getValues(),n=this.#x.getOrientation();r?t[n.getThirdColMajorDirection()]=0:t[3]=0;const i=new e(t),o=this.#x.getImage().getGeometry();this.setCurrentPosition(o.indexToWorld(i))}}),i)}else this.stop()}stop(){void 0!==this.#Xe&&(clearInterval(this.#Xe),this.#Xe=void 0)}getWindowLevel(){return this.#x.getWindowLevel()}getCurrentWindowPresetName(){return this.#x.getCurrentWindowPresetName()}setWindowLevel(e){this.#x.setWindowLevel(e)}getColourMap(){return this.#x.getColourMap()}setColourMap(e){this.#x.setColourMap(e)}setViewAlphaFunction(e){this.#x.setAlphaFunction(e)}addEventListener(e,t){this.#Oe.add(e,t)}removeEventListener(e,t){this.#Oe.remove(e,t)}#Re=e=>{e.dataid=this.#We,this.#Oe.fireEvent(e)}}const Kt=["mousedown","mousemove","mouseup","mouseout","wheel","dblclick","touchstart","touchmove","touchend"],Jt={openRoiDialog(e,t){const n=prompt("Label",e.textExpr);null!==n&&(e.textExpr=n,t(e))}};function $t(e){let t=0,n=0;if(0!==e.length&&void 0!==e[0].target){let i=e[0].target.offsetParent;for(;i;)isNaN(i.offsetLeft)||(t+=i.offsetLeft),isNaN(i.offsetTop)||(n+=i.offsetTop),i=i.offsetParent}else i.debug("No touch target offset parent.");const r=[];for(let i=0;i{this.#We===e.dataid&&(this.#et.setImage(e.value[0],this.#We),this.#Tt(this.#et.getImageSize().get2D()),this.#ft=!0)};onimagechange=e=>{this.#We===e.dataid&&(this.#rt=this.#et.isPositionInBounds(),this.#ft=!0)};getId(){return this.#$e.id}getBaseSize(){return this.#at}getImageWorldSize(){return this.#et.getImageWorldSize()}getOpacity(){return this.#lt}setOpacity(e){if(e===this.#lt)return;this.#lt=Math.min(Math.max(e,0),1);const t={type:"opacitychange",value:[this.#lt]};this.#Re(t)}addFlipOffsetX(){this.#pt.x+=this.#tt.width/this.#ct.x,this.#St.x+=this.#pt.x}addFlipOffsetY(){this.#pt.y+=this.#tt.height/this.#ct.y,this.#St.y+=this.#pt.y}flipScaleX(){this.#dt.x*=-1}flipScaleY(){this.#dt.y*=-1}flipScaleZ(){this.#dt.z*=-1}setScale(e,t){const n=this.#et.getPlaneHelper(),i=n.getTargetOrientedPositiveXYZ({x:e.x*this.#dt.x,y:e.y*this.#dt.y,z:e.z*this.#dt.z}),r={x:this.#ut.x*i.x,y:this.#ut.y*i.y};if(1===Math.abs(e.x)&&1===Math.abs(e.y)&&1===Math.abs(e.z)){const e={x:this.#St.x-this.#mt.x,y:this.#St.y-this.#mt.y};this.#mt={x:0,y:0},this.#St=e}else if(void 0!==t){let e=n.getPlaneOffsetFromOffset3D({x:t.getX(),y:t.getY(),z:t.getZ()});e={x:e.x+this.#ht.x,y:e.y+this.#ht.y};const i=Pn(this.#St,this.#ct,r,e),o={x:this.#mt.x+i.x-this.#St.x,y:this.#mt.y+i.y-this.#St.y};this.#mt=o,this.#St=i}this.#ct=r}initScale(e,t){const n=this.#et.getPlaneHelper().getTargetOrientedPositiveXYZ({x:e.x*this.#dt.x,y:e.y*this.#dt.y,z:e.z*this.#dt.z}),i={x:this.#ut.x*n.x,y:this.#ut.y*n.y};this.#ct=i,this.#mt=t,this.#St={x:this.#St.x+t.x,y:this.#St.y+t.y}}setBaseOffset(e,t){const n=this.#et.getPlaneHelper(),i=n.getNativeScrollIndex(),r=n.getPlaneOffsetFromOffset3D({x:0===i?e.getX():t.getX(),y:1===i?e.getY():t.getY(),z:2===i?e.getZ():t.getZ()}),o=this.#ht.x!==r.x||this.#ht.y!==r.y;return o&&(this.#St={x:this.#St.x-this.#ht.x+r.x,y:this.#St.y-this.#ht.y+r.y},this.#ht=r),o}setOffset(e){const t=this.#et.getPlaneHelper().getPlaneOffsetFromOffset3D(e);this.#St={x:t.x+this.#gt.x+this.#ht.x+this.#mt.x+this.#pt.x,y:t.y+this.#gt.y+this.#ht.y+this.#mt.y+this.#pt.y}}displayToPlaneIndex(t){const n=this.displayToPlanePos(t);return new e([Math.floor(n.getX()),Math.floor(n.getY())])}displayToPlaneScale(e){return new A(e.getX()/this.#ct.x,e.getY()/this.#ct.y)}displayToPlanePos(e){const t=this.displayToPlaneScale(e);return new A(t.getX()+this.#St.x,t.getY()+this.#St.y)}planePosToDisplay(e){let t=(e.getX()-this.#St.x+this.#ht.x)*this.#ct.x,n=(e.getY()-this.#St.y+this.#ht.y)*this.#ct.y;return(t<0||t>=this.#tt.width)&&(t=void 0),(n<0||n>=this.#tt.height)&&(n=void 0),new A(t,n)}displayToMainPlanePos(e){const t=this.displayToPlanePos(e);return new A(t.getX()-this.#ht.x,t.getY()-this.#ht.y)}display(e){this.#$e.style.display=e?"":"none"}isVisible(){return""===this.#$e.style.display}draw(){if(!this.#rt)return;let e={type:"renderstart",layerid:this.getId(),dataid:this.getDataId()};this.#Re(e),this.#ft&&this.#Lt(),this.#it.globalAlpha=this.#lt,this.clear(),this.#it.setTransform(this.#ct.x,0,0,this.#ct.y,-1*this.#St.x*this.#ct.x,-1*this.#St.y*this.#ct.y),this.#it.imageSmoothingEnabled=this.#yt,this.#it.drawImage(this.#nt,0,0),e={type:"renderend",layerid:this.getId(),dataid:this.getDataId()},this.#Re(e)}initialise(e,t,n){this.#st=t,this.#lt=Math.min(Math.max(n,0),1),this.#tt=document.createElement("canvas"),this.#$e.appendChild(this.#tt),this.#tt.getContext?(this.#it=this.#tt.getContext("2d"),this.#it?(this.#nt=document.createElement("canvas"),this.#Tt(e),this.#ft=!0):alert("Error: failed to get the 2D context.")):alert("Error: no canvas.getContext method.")}#Tt(e){if(!nn(e.x,e.y))throw new Error("Cannot create canvas with size "+e.x+", "+e.y);this.#at=e,this.#nt.width=this.#at.x,this.#nt.height=this.#at.y,this.#it.clearRect(0,0,this.#at.x,this.#at.y),this.#ot=this.#it.createImageData(this.#at.x,this.#at.y)}fitToContainer(e,t,n){let i=!1;if(this.#tt.width!==t.x||this.#tt.height!==t.y){if(!nn(t.x,t.y))throw new Error("Cannot resize canvas "+t.x+", "+t.y);this.#tt.width=t.x,this.#tt.height=t.y,i=!0}const r={x:e*this.#st.x,y:e*this.#st.y},o={x:this.#ct.x*r.x/this.#ut.x,y:this.#ct.y*r.y/this.#ut.y};this.#ct.x===o.x&&this.#ct.y===o.y||(this.#ut=r,this.#ct=o,i=!0);const a={x:n.x/r.x,y:n.y/r.y},s={x:0!==this.#pt.x?t.x/r.x:0,y:0!==this.#pt.y?t.y/r.y:0};this.#gt.x===a.x&&this.#gt.y===a.y&&this.#pt.x===s.x&&this.#pt.y===s.y||(this.#St={x:this.#St.x+a.x-this.#gt.x+s.x-this.#pt.x,y:this.#St.y+a.y-this.#gt.y+s.y-this.#pt.y},this.#pt=s,this.#gt=a,i=!0),i&&this.draw()}bindInteraction(){this.#$e.style.pointerEvents="auto";const e=Kt;for(let t=0;t{e.srclayerid=this.getId(),e.dataid=this.#We,this.#Oe.fireEvent(e)};#Lt(){this.#et.generateImageData(this.#ot),this.#nt.getContext("2d").putImageData(this.#ot,0,0),this.#ft=!1}#Dt=e=>{void 0!==e.skipGenerate&&!0===e.skipGenerate||(this.#ft=!0,this.draw())};#Ct=e=>{void 0!==e.skipGenerate&&!0===e.skipGenerate||(this.#ft=!0,this.draw())};#vt=e=>{if(void 0===e.skipGenerate||!0!==e.skipGenerate){let t=!0;if(void 0!==e.valid&&(t=e.valid),t){const t=[0,1,2],n=t.indexOf(this.#et.getScrollIndex());t.splice(n,1),0===e.diffDims.filter((function(e){return-1===t.indexOf(e)})).length&&this.#rt||(this.#rt=!0,this.#ft=!0,this.draw())}else this.#rt&&(this.#rt=!1,this.clear())}};#It=e=>{void 0!==e.skipGenerate&&!0===e.skipGenerate||(this.#ft=!0,this.draw())};setCurrentPosition(e,t){return this.#et.setCurrentPosition(e)}clear(){this.#it.save(),this.#it.setTransform(1,0,0,1,0,0),this.#it.clearRect(0,0,this.#tt.width,this.#tt.height),this.#it.restore()}}var on=o(944),an=o.n(on);class sn{#Pt=10;#wt="Verdana";#Ot="#fff";#At="#ffff80";#bt={x:1,y:1};#xt={x:1,y:1};#Rt=2;#Ft={x:.25,y:.25};#Et=.2;#qt=3;getFontFamily(){return this.#wt}getFontSize(){return this.#Pt}getStrokeWidth(){return this.#Rt}getTextColour(){return this.#Ot}getLineColour(){return this.#At}setLineColour(e){this.#At=e}setBaseScale(e){this.#bt=e}setZoomScale(e){this.#xt=e}getBaseScale(){return this.#bt}getZoomScale(){return this.#xt}scale(e){return e/this.#bt.x}applyZoomScale(e){return{x:2*e/this.#xt.x,y:2*e/this.#xt.y}}getShadowOffset(){return this.#Ft}getTagOpacity(){return this.#Et}getTextPadding(){return this.#qt}getFontStr(){return"normal "+this.getFontSize()+"px sans-serif"}getLineHeight(){return this.getFontSize()+this.getFontSize()/5}getScaledFontSize(){return this.scale(this.getFontSize())}getScaledStrokeWidth(){return this.scale(this.getStrokeWidth())}getShadowLineColour(){return y(this.getLineColour())}}function ln(e){let t="shape";return e instanceof an().Line?t=4===e.points().length?"line":6===e.points().length?"protractor":"roi":e instanceof an().Rect?t="rectangle":e instanceof an().Ellipse&&(t="ellipse"),t}class cn{#T;#Ut;#Mt;#Qt;#Bt;constructor(e,t,n,i){this.#T=e,this.#Ut=t,this.#Mt=n,this.#Qt=void 0!==i&&i,this.#Bt=e.getParent()}getName(){return"Draw-"+this.#Ut}execute(){this.#Bt.add(this.#T),this.#Mt.getKonvaLayer().draw(),this.#Qt||this.onExecute({type:"drawcreate",id:this.#T.id(),srclayerid:this.#Mt.getId(),dataid:this.#Mt.getDataId()})}undo(){this.#T.remove(),this.#Mt.getKonvaLayer().draw(),this.onUndo({type:"drawdelete",id:this.#T.id(),srclayerid:this.#Mt.getId(),dataid:this.#Mt.getDataId()})}onExecute(e){}onUndo(e){}}class un{#T;#Ut;#Vt;#Mt;constructor(e,t,n,i){this.#T=e,this.#Ut=t,this.#Vt=n,this.#Mt=i}getName(){return"Move-"+this.#Ut}execute(){this.#T.move(this.#Vt),this.#Mt.getKonvaLayer().draw(),this.onExecute({type:"drawmove",id:this.#T.id(),srclayerid:this.#Mt.getId(),dataid:this.#Mt.getDataId()})}undo(){const e={x:-this.#Vt.x,y:-this.#Vt.y};this.#T.move(e),this.#Mt.getKonvaLayer().draw(),this.onUndo({type:"drawmove",id:this.#T.id(),srclayerid:this.#Mt.getId(),dataid:this.#Mt.getDataId()})}onExecute(e){}onUndo(e){}}class dn{#Ut;#Nt;#Gt;#kt;#Mt;#et;#Ht;constructor(e,t,n,i,r,o,a){this.#Ut=e,this.#Nt=t,this.#Gt=n,this.#kt=i,this.#Mt=r,this.#et=o,this.#Ht=a}getName(){return"Change-"+this.#Ut}execute(){this.#Nt.update(this.#kt,this.#Ht,this.#et),this.#Mt.getKonvaLayer().draw(),this.onExecute({type:"drawchange",id:this.#kt.getParent().id(),srclayerid:this.#Mt.getId(),dataid:this.#Mt.getDataId()})}undo(){this.#Nt.update(this.#Gt,this.#Ht,this.#et),this.#Mt.getKonvaLayer().draw(),this.onUndo({type:"drawchange",id:this.#Gt.getParent().id(),srclayerid:this.#Mt.getId(),dataid:this.#Mt.getDataId()})}onExecute(e){}onUndo(e){}}class Sn{#T;#Ut;#Mt;#Bt;constructor(e,t,n){this.#T=e,this.#Ut=t,this.#Mt=n,this.#Bt=e.getParent()}getName(){return"Delete-"+this.#Ut}execute(){this.#T.remove(),this.#Mt.getKonvaLayer().draw(),this.onExecute({type:"drawdelete",id:this.#T.id(),srclayerid:this.#Mt.getId(),dataid:this.#Mt.getDataId()})}undo(){this.#Bt.add(this.#T),this.#Mt.getKonvaLayer().draw(),this.onUndo({type:"drawcreate",id:this.#T.id(),srclayerid:this.#Mt.getId(),dataid:this.#Mt.getDataId()})}onExecute(e){}onUndo(e){}}class hn{quantification;textExpr}class gn{id;position;type;color;meta}function mn(e){return"shape"===e.name()}function pn(e){return e.name().startsWith("shape-")}function fn(e){return"label"===e.name()}function yn(e){return"position-group"===e.name()}function Dn(e){return function(t){return t.id()===e}}function Cn(e){return"anchor"!==e.name()&&"label"!==e.name()}class vn{#zt;#Wt;#Yt=null;constructor(e){this.#zt=e,this.#Wt=e.getKonvaLayer()}getCurrentPosGroup(){const e=this.#Wt.getChildren((e=>e.id()===this.#Yt));let t;return 1===e.length?e[0]instanceof an().Group&&(t=e[0]):0===e.length?(t=new(an().Group),t.name("position-group"),t.id(this.#Yt),t.visible(!0),this.#Wt.add(t)):i.warn("Unexpected number of draw position groups."),t}reset(){this.#Wt=null}getGroup(e){const t=this.#Wt.findOne("#"+e);return void 0===t&&i.warn("Cannot find node with id: "+e),t}activateDrawLayer(e,t){const n=[t];for(let t=3;t{e.srclayerid=this.getId(),e.dataid=this.#We,this.#Oe.fireEvent(e)};#Zt(e){const t=2/e.x,n=2/e.y,i=this.#Xt.find("Label");for(let e=0;e{this.#tn()};getDivId(){return this.#$e.id}getScale(){return this.#ct}getBaseScale(){return this.#bt}getAddedScale(){return{x:this.#ct.x/this.#bt.x,y:this.#ct.y/this.#bt.y,z:this.#ct.z/this.#bt.z}}getOffset(){return this.#St}getNumberOfLayers(){let e=0;return this.#_t.forEach((t=>{void 0!==t&&e++})),e}getNumberOfViewLayers(){let e=0;return this.#_t.forEach((t=>{void 0!==t&&t instanceof rn&&e++})),e}getActiveViewLayer(){let e;if(void 0!==this.#Kt){const t=this.#_t[this.#Kt];t instanceof rn&&(e=t)}else i.info("No active view layer to return");return e}getBaseViewLayer(){let e;return this.#_t[0]instanceof rn&&(e=this.#_t[0]),e}getViewLayersByDataId(e){const t=[];for(const n of this.#_t)n instanceof rn&&n.getDataId()===e&&t.push(n);return t}searchViewLayers(e){const t=[];for(const n of this.#_t)n instanceof rn&&n.getViewController().equalImageMeta(e)&&t.push(n);return t}getViewDataIndices(){const e=[];for(const t of this.#_t)t instanceof rn&&e.push(t.getDataId());return e}getActiveDrawLayer(){let e;if(void 0!==this.#Jt){const t=this.#_t[this.#Jt];t instanceof In&&(e=t)}else i.info("No active draw layer to return");return e}getDrawLayersByDataId(e){const t=[];for(const n of this.#_t)n instanceof In&&n.getDataId()===e&&t.push(n);return t}setActiveViewLayer(e){this.#_t[e]instanceof rn?(this.#Kt=e,this.#Re({type:"activelayerchange",value:[this.#_t[e]]})):i.warn("No view layer to set as active with index: "+e)}setActiveViewLayerByDataId(e){let t;for(let n=0;n0;)e[0].remove()}removeLayersByDataId(e){for(const t of this.#_t)void 0!==t&&t.getDataId()===e&&this.removeLayer(t)}removeLayer(e){const t=this.#_t.findIndex((t=>t===e));if(-1===t)throw new Error("Cannot find layer to remove");if(e instanceof rn)this.#an(e),this.#Kt===t&&(t-2>=0?this.setActiveViewLayer(t-2):this.#Kt=void 0);else{const n=e.getNumberOfDraws();if(void 0!==n){let t=0;e.addEventListener("drawdelete",(i=>{++t,t===n&&this.#sn(e)}))}e.deleteDraws(),void 0===n&&this.#sn(e),this.#Jt===t&&(t-2>=0?this.setActiveDrawLayer(t-2):this.#Jt=void 0)}this.#_t[t]=void 0;const n=document.getElementById(e.getId());n&&n.remove()}#tn(e){let t;void 0===e&&(e=this.#Be),this.#nn();for(const e of this.#_t)if(e instanceof rn){t=e;break}if(void 0===t)return void i.warn("No layer to show crosshair");const n=t.getViewController().getPlanePositionFromPosition(e),r=t.planePosToDisplay(n);if(void 0!==r.getY()){const e=document.createElement("hr");e.id=this.getDivId()+"-scroll-crosshair-horizontal",e.className="horizontal",e.style.width=this.#$e.offsetWidth+"px",e.style.left="0px",e.style.top=r.getY()+"px",this.#$e.appendChild(e)}if(void 0!==r.getX()){const e=document.createElement("hr");e.id=this.getDivId()+"-scroll-crosshair-vertical",e.className="vertical",e.style.width=this.#$e.offsetHeight+"px",e.style.left=r.getX()+"px",e.style.top="0px",this.#$e.appendChild(e)}}#nn(){let e=document.getElementById(this.getDivId()+"-scroll-crosshair-horizontal");e&&e.remove(),e=document.getElementById(this.getDivId()+"-scroll-crosshair-vertical"),e&&e.remove()}someViewLayer(e){let t=!1;for(const n of this.#_t)if(n instanceof rn&&e(n)){t=!0;break}return t}isPositionInBounds(e){return this.someViewLayer((function(t){return t.getViewController().isPositionInBounds(e)}))}canScroll(){return this.someViewLayer((function(e){return e.getViewController().canScroll()}))}moreThanOne(e){return this.someViewLayer((function(t){return t.getViewController().moreThanOne(e)}))}updateLayersToPositionChange=t=>{for(const e of this.#_t)e instanceof rn&&(e.removeEventListener("positionchange",this.updateLayersToPositionChange),e.removeEventListener("positionchange",this.#Re));const n=new e(t.value[0]),i=new x(t.value[1]);let r,o,a,s;this.#Be=i,this.#$t&&this.#tn(i);for(const e of this.#_t){if(void 0===e)continue;let l=!1;if(e instanceof rn){const t=e.getViewController(),n=t.getOrigin(),c=t.getOrigin(i);if(void 0===o){r=n,o=c;const t=new T(0,0,0);l=e.setBaseOffset(t,t)}else if(t.isPositionInBounds(i)&&void 0!==c){const e=r.minus(n);a=new T(e.getX(),e.getY(),e.getZ());const t=o.minus(c);s=new T(t.getX(),t.getY(),t.getZ())}}void 0!==a&&void 0!==s&&(l=e.setBaseOffset(a,s));let c=!1;e.getId()!==t.srclayerid&&(c=e.setCurrentPosition(i,n)),!c&&l&&e.draw()}for(const e of this.#_t)e instanceof rn&&(e.addEventListener("positionchange",this.updateLayersToPositionChange),e.addEventListener("positionchange",this.#Re))};calculateFitScale(){if(0===this.#$e.offsetWidth&&0===this.#$e.offsetHeight)throw new Error("Cannot fit to zero sized container.");const e=this.getMaxSize();if(void 0!==e){if(0===this.#$e.offsetHeight){const t=this.#$e.offsetWidth/e.x,n=e.y*t;this.#$e.style.height=n+"px"}return Math.min(this.#$e.offsetWidth/e.x,this.#$e.offsetHeight/e.y)}}setFitScale(e){const t=this.getMaxSize();if(void 0===t)return;const n={x:this.#$e.offsetWidth,y:this.#$e.offsetHeight},i={x:-.5*(n.x-Math.floor(t.x*e)),y:-.5*(n.y-Math.floor(t.y*e))};for(const t of this.#_t)void 0!==t&&t.fitToContainer(e,n,i);this.#$t&&this.#tn()}getMaxSize(){let e={x:0,y:0};for(const t of this.#_t)if(t instanceof rn){const n=t.getImageWorldSize();n.x>e.x&&(e.x=n.x),n.y>e.y&&(e.y=n.y)}return 0===e.x&&0===e.y&&(e=void 0),e}flipScaleZ(){this.#bt.z*=-1,this.setScale(this.#bt)}addScale(e,t){const n={x:this.#ct.x*(1+e),y:this.#ct.y*(1+e),z:this.#ct.z*(1+e)};this.setScale(n,t)}setScale(e,t){this.#ct=e;for(const e of this.#_t)void 0!==e&&e.setScale(this.#ct,t);const n=[e.x,e.y,e.z];void 0!==t&&(n.push(t.getX()),n.push(t.getY()),n.push(t.getZ())),this.#Re({type:"zoomchange",value:n})}addTranslation(e){this.setOffset({x:this.#St.x-e.x,y:this.#St.y-e.y,z:this.#St.z-e.z})}setOffset(e){this.#St=e;for(const e of this.#_t)void 0!==e&&e.setOffset(this.#St);this.#Re({type:"offsetchange",value:[this.#St.x,this.#St.y,this.#St.z]})}reset(){this.setScale(this.#bt),this.setOffset({x:0,y:0,z:0})}draw(){for(const e of this.#_t)void 0!==e&&e.draw()}display(e){for(const t of this.#_t)void 0!==t&&t.display(e)}addEventListener(e,t){this.#Oe.add(e,t)}removeEventListener(e,t){this.#Oe.remove(e,t)}#Re=e=>{this.#Oe.fireEvent(e)}}const On={WindowLevelBinder:class{getEventType=function(){return"wlchange"};getCallback=function(e){return function(t){const n=e.getViewLayersByDataId(t.dataid);if(0!==n.length){const e=n[0].getViewController();if(2===t.value.length){const n=new r(t.value[0],t.value[1]);e.setWindowLevel(n)}3===t.value.length&&e.setWindowLevelPreset(t.value[2])}}}},PositionBinder:class{getEventType=function(){return"positionchange"};getCallback=function(e){return function(t){const n=t.value[1],i=e.getActiveViewLayer().getViewController(),r=i.getCurrentPosition(),o=r.length(),a=n.length;a!==o&&(a===o-1?n.push(r.get(o-1)):a===o+1&&n.pop()),i.setCurrentPosition(new x(n))}}},ZoomBinder:class{getEventType=function(){return"zoomchange"};getCallback=function(e){return function(t){const n={x:t.value[0],y:t.value[1],z:t.value[2]};let i;6===t.value.length&&(i=new b(t.value[3],t.value[4],t.value[5])),e.setScale(n,i),e.draw()}}},OffsetBinder:class{getEventType=function(){return"offsetchange"};getCallback=function(e){return function(t){e.setOffset({x:t.value[0],y:t.value[1],z:t.value[2]}),e.draw()}}},OpacityBinder:class{getEventType=function(){return"opacitychange"};getCallback=function(e){return function(t){if(void 0===t.dataid)return;const n=e.getViewLayersByDataId(t.dataid);0!==n.length&&e.getNumberOfViewLayers()>1&&(n[0].setOpacity(t.value),n[0].draw())}}},ColourMapBinder:class{getEventType=function(){return"colourmapchange"};getCallback=function(e){return function(t){const n=e.getViewLayersByDataId(t.dataid);0!==n.length&&n[0].getViewController().setColourMap(t.value[0])}}}};class An{#ln=[];#cn=null;#yt=!1;#un=[];#dn=null;getLayerGroup(e){return this.#ln[e]}getNumberOfLayerGroups(){return this.#ln.length}getActiveLayerGroup(){return this.getLayerGroup(this.#cn)}setActiveLayerGroup(e){void 0!==this.getLayerGroup(e)?this.#cn=e:i.warn("No layer group to set as active with index: "+e)}getViewLayersByDataId(e){let t=[];for(let n=0;nt===e));if(-1===t)throw new Error("Cannot find layerGroup to remove");this.unbindLayerGroups(),e.empty(),this.#ln.splice(t,1),this.#cn===t&&(this.#cn=void 0),this.bindLayerGroups()}reset(){for(let e=0;e{this.#hn(t,e),e.getCallback(this.#ln[t])(n),this.#Sn(t,e)}},this.#dn[t].push(n)),n.callback}#Sn(e,t){for(let n=0;n0&&(--this.#vn,this.#Cn[this.#vn].undo(),this.#Re({type:"undo",command:this.#Cn[this.#vn].getName()}))}redo(){this.#vn{this.#Oe.fireEvent(e)}}class Qn{#In;#Tn=null;#dn=[];#Ln={};constructor(e){this.#In=e}init(){for(const e in this.#In)this.#In[e].init();this.enableShortcuts(!0)}enableShortcuts(e){e?window.addEventListener("keydown",this.#Pn("window","keydown"),!0):window.removeEventListener("keydown",this.#Pn("window","keydown"),!0)}getToolList(){return this.#In}hasTool(e){return void 0!==this.getToolList()[e]}getSelectedTool(){return this.#Tn}getSelectedToolEventHandler(e){return this.getSelectedTool()[e]}setSelectedTool(e){if(!this.hasTool(e))throw new Error("Unknown tool: '"+e+"'");this.#Tn&&this.#Tn.activate(!1),this.#Tn=this.#In[e],this.#Tn.activate(!0)}setToolFeatures(e){this.getSelectedTool()&&this.getSelectedTool().setFeatures(e)}bindLayerGroup(e,t){const n=e.getDivId();e.addEventListener("activelayerchange",this.#wn(n)),this.#On(n,t)}#On(e,t){void 0!==this.#Ln[e]&&this.#An(this.#Ln[e]),this.#Ln[e]=t,this.#bn(t)}#wn(e){return t=>{const n=t.value[0];this.#On(e,n)}}#bn(e){e.bindInteraction();const t=Kt;for(let n=0;n{if(this.#Tn){const t=this.#Tn[e.type];t&&t(e)}};this.#dn[e][t]=n}return this.#dn[e][t]}}class Bn{#xn=[];#Rn=2;#Fn;constructor(e){this.#Fn=e}setNumberOfDimensions(e){this.#Rn=e}setNToLoad(e){for(let t=0;t{if(!e.lengthComputable)return;if(void 0===e.subindex)return;if(void 0===e.index)return;const t=100*e.loaded/e.total;this.#xn[e.index][e.subindex]=t;let n=null;n=void 0!==e.item?e.item:{loaded:this.#En(e.index),total:100,source:e.source},this.#Fn({lengthComputable:!0,loaded:this.#qn(),total:100,item:n})};#En(e){let t=0;for(let n=0;n{n.index=e,n.subindex=t,this.onprogress(n)}}getUndefinedMonoProgressHandler(e){return t=>{t.subindex=e,this.onprogress(t)}}}class Vn{#Un=null;#Mn=[];#Qn=null;#Bn=0;#Vn=0;#Nn;#F;getDefaultCharacterSet(){return this.#F}setDefaultCharacterSet(e){this.#F=e}#Gn(e){this.#Un=e,this.#Bn=0,this.#Vn=0,this.#Nn=!1,this.#kn(),this.#Hn()}#zn(e){this.#Mn.push(e)}#kn(){this.#Mn=[]}#Wn(e){this.#Qn=e}#Hn(){this.#Qn=null}#Yn=e=>{this.#Bn++,this.#Bn===this.#Un.length&&this.onload({source:this.#Un})};#Xn=e=>{this.#Vn++,this.#Vn===this.#Un.length&&this.onloadend({source:this.#Un})};#jn(e,t){return n=>{n.source=t,e(n)}}load(e,t){this.onloadstart({source:e}),1===e.length&&(F(e[0],"DICOMDIR")||F(e[0],".dcmdir"))?this.#Zn(e[0],t):this.#_n(e,t)}#Kn(e,t,n){return i=>{const r=i.target.status;200!==r&&0!==r?(this.onerror({source:t,error:"GET "+i.target.responseURL+" "+i.target.status+" ("+i.target.statusText+")",target:i.target}),this.#Xn()):e.load(i.target.response,t,n)}}#_n(e,t){if(void 0===e||0===e.length)return;this.#Gn(e);const n=new Bn(this.onprogress);n.setNToLoad(e.length);const i=[];for(let e=0;e{s{this.#Xn(),s(e)};const c=this.#jn(this.onabort,r);a.onabort=e=>{this.#Xn(),c(e)},1===o.loadUrlAs()&&(a.responseType="arraybuffer"),this.#zn(a)}let c=this.#Mn.length;void 0!==t&&void 0!==t.batchSize&&0!==c&&(c=Math.min(t.batchSize,this.#Mn.length));for(let e=0;e{const r=n.target.status;if(200!==r&&0!==r)this.onerror({source:e,error:"GET "+n.target.responseURL+" "+n.target.status+" ("+n.target.statusText+")",target:n.target}),this.onloadend({});else{const r=function(e){const t=new Ge;t.parse(e);const n=t.getDicomElements();if(void 0===n["00041220"]||void 0===n["00041220"].value)return void i.warn("No Directory Record Sequence found in DICOMDIR.");const r=n["00041220"].value;if(0===r.length)return void i.warn("The Directory Record Sequence of the DICOMDIR is empty.");const o=[];let a=null,s=null;for(let e=0;e{this.#jn(this.onerror,e)(t),this.onloadend({})},n.onabort=t=>{this.#jn(this.onabort,e)(t),this.onloadend({})},n.send(null)}abort(){this.#Nn=!0;for(let e=0;e0){const t=this.freeThreads.shift();this.runningThreads.push(t),t.run(e)}else this.taskQueue.push(e)}abort(){this.#Jn(),this.onabort({type:"work-abort"}),this.onworkend({type:"work-end"})}onTaskEnd(e){if(this.taskQueue.length>0){const t=this.taskQueue.shift();e.run(t)}else{e.stop(),this.freeThreads.push(e);for(let t=0;t{this.#Jn(),this.onerror({error:e}),this.onworkend({type:"work-end"})};#Jn(){this.taskQueue=[];for(let e=0;e{e.itemNumber=this.runningTask.info.itemNumber,e.numberOfItems=this.runningTask.info.numberOfItems,e.index=this.runningTask.info.index,this.parentPool.onworkitem(e),this.parentPool.onTaskEnd(this)};onerror=e=>{e.itemNumber=this.runningTask.info.itemNumber,e.numberOfItems=this.runningTask.info.numberOfItems,e.index=this.runningTask.info.index,this.parentPool.handleWorkerError(e),this.stop()}}class kn{constructor(e,t,n){this.script=e,this.startMessage=t,this.info=n}}const Hn="undefined"!=typeof JpegImage,zn="undefined"!=typeof jpeg&&void 0!==jpeg.lossless,Wn="undefined"!=typeof JpxImage,Yn={jpeg2000:"","jpeg-lossless":"","jpeg-baseline":"",rle:""};class Xn{#$n;#ei=new Nn(10);#ti=!1;constructor(e,t){this.#$n=e}decode(e,t,n){this.#ti||(this.#ti=!0,this.#ei.onworkstart=this.ondecodestart,this.#ei.onworkitem=this.ondecodeditem,this.#ei.onwork=this.ondecoded,this.#ei.onworkend=this.ondecodeend,this.#ei.onerror=this.onerror,this.#ei.onabort=this.onabort);const i=new kn(this.#$n,{buffer:e,meta:t},n);this.#ei.addWorkerTask(i)}abort(){this.#ei.abort()}ondecodestart(e){}ondecodeditem(e){}ondecoded(e){}ondecodeend(e){}onerror(e){}onabort(e){}}class jn{#ni;#ii;constructor(e,t){this.#ni=e,this.#ii=t}#ri=0;decode(e,t,n){++this.#ri;let i=null,r=null;if("jpeg-lossless"===this.#ni){if(!zn)throw new Error("No JPEG Lossless decoder provided");const n=t.bitsAllocated/8,o=new Uint8Array(e);i=new jpeg.lossless.Decoder;const a=i.decode(o.buffer,0,o.buffer.byteLength,n);8===t.bitsAllocated?r=t.isSigned?new Int8Array(a.buffer):new Uint8Array(a.buffer):16===t.bitsAllocated&&(r=t.isSigned?new Int16Array(a.buffer):new Uint16Array(a.buffer))}else if("jpeg-baseline"===this.#ni){if(!Hn)throw new Error("No JPEG Baseline decoder provided");i=new JpegImage,i.parse(e),r=i.getData(i.width,i.height)}else if("jpeg2000"===this.#ni){if(!Wn)throw new Error("No JPEG 2000 decoder provided");i=new JpxImage,i.parse(e),r=i.tiles[0].items}else"rle"===this.#ni&&(i=new dwvdecoder.RleDecoder,r=i.decode(e,t.bitsAllocated,t.isSigned,t.sliceSize,t.samplesPerPixel,t.planarConfiguration));this.ondecodeditem({data:[r],index:n.index,numberOfItems:n.numberOfItems,itemNumber:n.itemNumber}),this.#ri===this.#ii&&(this.ondecoded({}),this.ondecodeend({}))}abort(){this.onabort({}),this.ondecodeend({})}ondecodestart(e){}ondecodeditem(e){}ondecoded(e){}ondecodeend(e){}onerror(e){}onabort(e){}}class Zn{#ti=!1;#oi=null;constructor(e,t){void 0!==Yn&&void 0!==Yn[e]?this.#oi=new Xn(Yn[e],t):this.#oi=new jn(e,t)}decode(e,t,n){this.#ti||(this.#ti=!0,this.#oi.ondecodestart=this.ondecodestart,this.#oi.ondecodeditem=this.ondecodeditem,this.#oi.ondecoded=this.ondecoded,this.#oi.ondecodeend=this.ondecodeend,this.#oi.onerror=this.onerror,this.#oi.onabort=this.onabort),this.#oi.decode(e,t,n)}abort(){this.#oi.abort()}ondecodestart(e){}ondecodeditem(e){}ondecoded(e){}ondecodeend(e){}onerror(e){}onabort(e){}}class _n{#ai;setOptions(e){this.#ai=e}#oi=null;#si=[];#li=[];#ci=[];#ui=[];#di(e){let t;const n=e["00080060"];return void 0!==n&&"SEG"===n.value[0]&&(t=new Gt),void 0===t&&(t=new dt),t}#Si(e,t){const n=this.#si[e].getDicomElements(),i=this.#ui[e];try{const r=i.create(n,this.#li[e],this.#ai.numberOfFiles);this.onloaditem({data:{image:r,info:n},source:t,warn:i.getWarning()})}catch(e){this.onerror({error:e,source:t}),this.onloadend({source:t})}}#hi(e){this.onprogress({lengthComputable:!0,loaded:e.itemNumber+1,total:e.numberOfItems,index:e.index,source:origin});const t=e.index,n=e.data[0];if(1!==e.numberOfItems){if(void 0===this.#ci[t]){this.#ci[t]=n.length;const r=e.numberOfItems*this.#ci[t];try{this.#li[t]=new n.constructor(r)}catch(e){if(e instanceof RangeError){const e=Math.floor(Math.log(r)/Math.log(2));i.error("Cannot allocate "+n.constructor.name+" of size: "+r+" (>2^"+e+") for decompressed data.")}return this.#oi.abort(),this.onerror({error:e,source:origin}),void this.onloadend({source:origin})}}n.length!==this.#ci[t]&&i.warn("Unsupported varying decompressed data size: "+n.length+" != "+this.#ci[t]),this.#li[t].set(n,this.#ci[t]*e.itemNumber)}else this.#li[t]=n;0===e.itemNumber&&this.#Si(t,origin)}convert(e,t,n){this.onloadstart({source:t,index:n});const i=new Ge;let r;void 0!==this.#ai.defaultCharacterSet&&i.setDefaultCharacterSet(this.#ai.defaultCharacterSet);try{i.parse(e),r=this.#di(i.getDicomElements()),r.checkElements(i.getDicomElements())}catch(e){return this.onerror({error:e,source:t}),void this.onloadend({source:t})}const o=i.getDicomElements()["7FE00010"].value;i.getDicomElements()["7FE00010"].value=[];const a=function(e){let t=null;return Ee(e)?t="jpeg2000":Re(e)?t="jpeg-baseline":Fe(e)?t="jpeg-lossless":qe(e)&&(t="rle"),t}(i.getDicomElements()["00020010"].value[0]),s=null!==a;if(this.#si[n]=i,this.#li[n]=o[0],this.#ui[n]=r,s){const e={bitsAllocated:i.getDicomElements()["00280100"].value[0],isSigned:1===i.getDicomElements()["00280103"].value[0]},t=i.getDicomElements()["00280011"],r=i.getDicomElements()["00280010"];void 0!==t&&void 0!==r&&(e.sliceSize=t.value[0]*r.value[0]);const s=i.getDicomElements()["00280002"];void 0!==s&&(e.samplesPerPixel=s.value[0]);const l=i.getDicomElements()["00280006"];void 0!==l&&(e.planarConfiguration=l.value[0]);const c=o.length;null===this.#oi&&(this.#oi=new Zn(a,c),this.#oi.ondecodeditem=e=>{this.#hi(e),e.itemNumber+1===e.numberOfItems&&(this.onload(e),this.onloadend(e))},this.#oi.onerror=this.onerror,this.#oi.onabort=this.onabort);for(let t=0;t{this.#Bn++,this.#Bn===this.#Un.length&&this.onload({source:this.#Un})};#Xn=e=>{this.#Vn++,this.#Vn===this.#Un.length&&this.onloadend({source:this.#Un})};load(e){if(void 0===e||0===e.length)return;this.#Gn(e),this.onloadstart({source:e});const t=new Bn(this.onprogress);t.setNToLoad(e.length),t.setNumberOfDimensions(1);const n=[];for(let e=0;e{this.#gi=!1,this.onloadend(e)},this.#mi.onerror=e=>{e.source=t,this.onerror(e)},this.#mi.onabort=this.onabort),this.#gi=!0,this.#mi.convert(e,t,n)}abort(){this.#gi=!1,this.#mi.abort()}canLoadFile(e){const t=U(e.name);return null===t||"dcm"===t}canLoadUrl(e,t){if(void 0!==t){if(void 0!==t.forceLoader&&"dicom"===t.forceLoader)return!0;if(void 0!==t.requestHeaders){const e=function(e){return"Accept"===e.name},n=t.requestHeaders.find(e);if(void 0!==n)return R(n.value,"application/dicom")&&"+"!==n.value[18]}}const n=qn(e),i=U(n.pathname),r=null===i,o="dcm"===i,a=n.searchParams.get("contentType");return null!=a?"application/dicom"===a:r||o}canLoadMemory(e){const t=e["Content-Type"];if(void 0!==t&&t.startsWith("application/dicom"))return!0;if(void 0!==e.filename){const t=new File(["from memory"],e.filename);return this.canLoadFile(t)}return!1}loadFileAs(){return ii.ArrayBuffer}loadUrlAs(){return 1}onloadstart(e){}onprogress(e){}onloaditem(e){}onload(e){}onloadend(e){}onerror(e){}onabort(e){}},class{#gi=!1;setOptions(e){}isLoading(){return this.#gi}load(e,t,n){this.#gi=!0,this.onloadstart({source:t});try{this.onprogress({lengthComputable:!0,loaded:100,total:100,index:n,source:t});const i={data:e,source:t};this.onloaditem(i),this.onload(i)}catch(e){this.onerror({error:e,source:t})}finally{this.#gi=!1,this.onloadend({source:t})}}abort(){this.#gi=!1,this.onabort({}),this.onloadend({})}canLoadFile(e){return"json"===U(e.name)}canLoadUrl(e,t){if(void 0!==t){if(void 0!==t.forceLoader&&"json"===t.forceLoader)return!0;if(void 0!==t.requestHeaders){const e=function(e){return"Accept"===e.name},n=t.requestHeaders.find(e);if(void 0!==n)return R(n.value,"application/json")||R(n.value,"application/dicom+json")}}return"json"===U(qn(e).pathname)}canLoadMemory(e){const t=e["Content-Type"];if(void 0!==t&&t.startsWith("application/json"))return!0;if(void 0!==e.filename){const t=new File(["from memory"],e.filename);return this.canLoadFile(t)}return!1}loadFileAs(){return ii.Text}loadUrlAs(){return 0}onloadstart(e){}onprogress(e){}onloaditem(e){}onload(e){}onloadend(e){}onerror(e){}onabort(e){}},class{#gi=!1;setOptions(e){}isLoading(){return this.#gi}load(e,t,n){this.onloadstart({source:t}),this.#gi=!0;const i=new Kn;i.onprogress=e=>{e.loaded=50+e.loaded/2,e.index=n,this.onprogress(e)},i.onloaditem=this.onloaditem,i.onload=this.onload,i.onloadend=e=>{this.#gi=!1,this.onloadend(e)},i.onerror=this.onerror,i.onabort=this.onabort,i.load(function(e){const t=new Uint8Array(e),n=[];if(0===t.length)return n;const i=k(new Uint8Array([13,10,13,10]));let r=G(t,i,0);if(void 0===r)throw new Error("Can't find the end of the first multipart header");const o=N(t.slice(0,r)).split("\r\n");let a;for(let e=0;e{try{if(!this.#pi){this.onprogress({lengthComputable:!0,loaded:100,total:100,index:n,source:t});const e=function(e,t,n){const i=e.width,r=e.height,o=document.createElement("canvas");o.width=i,o.height=r;const a=o.getContext("2d");a.drawImage(e,0,0);const s=a.getImageData(0,0,i,r),l={};"string"==typeof t?l.origin={value:t}:(l.fileName={value:t.name},l.fileType={value:t.type},l.fileLastModifiedDate={value:t.lastModified}),l.imageWidth={value:i},l.imageHeight={value:r};const c=n||0;return l.imageUid={value:c},{data:{image:$n(i,r,c,Jn(s),1,c.toString()),info:l},source:t}}(i,t,n);this.onloaditem(e),this.onload(e)}}catch(e){this.onerror({error:e,source:t})}finally{this.onloadend({source:t})}},"string"==typeof e)i.src=e;else if("string"==typeof t){const n=t.split(".").pop().toLowerCase();i.src=this.#fi(e,n)}}abort(){this.#pi=!0,this.onabort({}),this.onloadend({})}canLoadFile(e){return void 0!==e.type&&null!==e.type.match("image.*")}canLoadUrl(e,t){if(void 0!==t){if(void 0!==t.forceLoader&&"rawimage"===t.forceLoader)return!0;if(void 0!==t.requestHeaders){const e=function(e){return"Accept"===e.name},n=t.requestHeaders.find(e);if(void 0!==n)return R(n.value,"image/")}}const n=qn(e),i=U(n.pathname),r="jpeg"===i||"jpg"===i||"png"===i||"gif"===i,o=n.searchParams.get("contentType");return null!=o?"image/jpeg"===o||"image/png"===o||"image/gif"===o:r}canLoadMemory(e){if(void 0!==e.filename){const t=new File(["from memory"],e.filename);return this.canLoadFile(t)}return!1}loadFileAs(){return ii.DataURL}loadUrlAs(){return 1}onloadstart(e){}onprogress(e){}onloaditem(e){}onload(e){}onloadend(e){}onerror(e){}onabort(e){}},class{setOptions(e){}isLoading(){return!0}#fi(e,t){const n=new Uint8Array(e);let i="";for(let e=0;e{try{!function(e,t,n,i,r,o,a){const s=e.videoWidth,l=e.videoHeight,c=Math.ceil(30*e.duration),u={};"string"==typeof o?u.origin={value:o}:(u.fileName={value:o.name},u.fileType={value:o.type},u.fileLastModifiedDate={value:o.lastModified}),u.imageWidth={value:s},u.imageHeight={value:l},u.numberOfFrames={value:c},u.imageUid={value:0};const d=document.createElement("canvas");d.width=s,d.height=l;const S=d.getContext("2d");e.addEventListener("seeked",(function d(p){(function(){i({lengthComputable:!0,loaded:h,total:c,index:a,source:o}),S.drawImage(e,0,0);const n=Jn(S.getImageData(0,0,s,l));0===h?(g=$n(s,l,1,n,c,a.toString()),t({data:{image:g,info:u},source:o})):g.appendFrameBuffer(n,h),++h})(),m+=1/30,m<=p.target.duration?this.currentTime=m:(n({source:o}),r({source:o}),e.removeEventListener("seeked",d))}),!1);let h=0,g=null,m=0;e.currentTime=m}(e.target,this.onloaditem,this.onload,this.onprogress,this.onloadend,t,n)}catch(e){this.onerror({error:e,source:t}),this.onloadend({source:t})}}}abort(){this.onabort({}),this.onloadend({})}canLoadFile(e){return void 0!==e.type&&null!==e.type.match("video.*")}canLoadUrl(e,t){if(void 0!==t){if(void 0!==t.forceLoader&&"rawvideo"===t.forceLoader)return!0;if(void 0!==t.requestHeaders){const e=function(e){return"Accept"===e.name},n=t.requestHeaders.find(e);if(void 0!==n)return R(n.value,"video/")}}const n=U(qn(e).pathname);return"mp4"===n||"ogg"===n||"webm"===n}canLoadMemory(e){if(void 0!==e.filename){const t=new File(["from memory"],e.filename);return this.canLoadFile(t)}return!1}loadFileAs(){return ii.DataURL}loadUrlAs(){return 1}onloadstart(e){}onprogress(e){}onloaditem(e){}onload(e){}onloadend(e){}onerror(e){}onabort(e){}},class{#gi=!1;setOptions(e){}isLoading(){return this.#gi}#yi="";#Di=[];#Ci=null;#vi(e,t,n){this.#Di.push({filename:this.#yi,data:e});const i=100*this.#Di.length/this.#Ci.length;if(this.onprogress({lengthComputable:!0,loaded:i/2,total:100,index:n,item:{loaded:i,total:100,source:t}}),this.#Di.length{this.#vi(e,t,n)}))}else{const e=new Kn;e.onprogress=e=>{e.loaded=50+e.loaded/2,e.index=n,this.onprogress(e)},e.onloaditem=this.onloaditem,e.onload=this.onload,e.onloadend=e=>{this.#gi=!1,this.onloadend(e)},e.onerror=this.onerror,e.onabort=this.onabort,e.load(this.#Di)}}load(e,t,n){this.onloadstart({source:t}),this.#gi=!0,ti().loadAsync(e).then((e=>{this.#Di=[],this.#Ci=e.file(/.*\.dcm/);const i=this.#Di.length;this.#yi=this.#Ci[i].name,this.#Ci[i].async("arrayBuffer").then((e=>{this.#vi(e,t,n)}))}))}abort(){this.#gi=!1,this.onabort({}),this.onloadend({})}canLoadFile(e){return"zip"===U(e.name)}canLoadUrl(e,t){if(void 0!==t){if(void 0!==t.forceLoader&&"zip"===t.forceLoader)return!0;if(void 0!==t.requestHeaders){const e=function(e){return"Accept"===e.name},n=t.requestHeaders.find(e);if(void 0!==n)return R(n.value,"application/zip")}}return"zip"===U(qn(e).pathname)}canLoadMemory(e){const t=e["Content-Type"];if(void 0!==t&&t.startsWith("application/zip"))return!0;if(void 0!==e.filename){const t=new File(["from memory"],e.filename);return this.canLoadFile(t)}return!1}loadFileAs(){return ii.ArrayBuffer}loadUrlAs(){return 1}onloadstart(e){}onprogress(e){}onloaditem(e){}onload(e){}onloadend(e){}onerror(e){}onabort(e){}}],ii={Text:0,ArrayBuffer:1,DataURL:2};class ri{#Un=null;#Ii=[];#Qn=null;#Bn=0;#Vn=0;#F;getDefaultCharacterSet(){return this.#F}setDefaultCharacterSet(e){this.#F=e}#Gn(e){this.#Un=e,this.#Bn=0,this.#Vn=0,this.#Ti(),this.#Hn()}#Li(e){this.#Ii.push(e)}#Ti(){this.#Ii=[]}#Wn(e){this.#Qn=e}#Hn(){this.#Qn=null}#Yn=e=>{this.#Bn++,this.#Bn===this.#Un.length&&this.onload({source:this.#Un})};#Xn=e=>{this.#Vn++,this.#Vn===this.#Un.length&&this.onloadend({source:this.#Un})};#jn(e,t){return n=>{n.source=t,e(n)}}#Kn(e,t,n){return i=>{e.load(i.target.result,t,n)}}load(e){if(void 0===e||0===e.length)return;this.#Gn(e),this.onloadstart({source:e});const t=new Bn(this.onprogress);t.setNToLoad(e.length);const n=[];for(let e=0;e{this.#Xn(),a(e)};const s=this.#jn(this.onabort,i);o.onabort=e=>{this.#Xn(),s(e)},r.loadFileAs()===ii.Text?o.readAsText(i):r.loadFileAs()===ii.DataURL?o.readAsDataURL(i):r.loadFileAs()===ii.ArrayBuffer&&o.readAsArrayBuffer(i)}}abort(){for(let e=0;e{this.#Pi[i]={loader:t,isFirstItem:!0},this.#jn(this.onloadstart,o)(e)},t.onprogress=this.#jn(this.onprogress,o),t.onloaditem=e=>{const t={loadtype:n,dataid:i};void 0!==this.#Pi[i]&&(t.isfirstitem=this.#Pi[i].isFirstItem),this.#jn(this.onloaditem,t)(e),void 0!==this.#Pi[i]&&this.#Pi[i].isFirstItem&&(this.#Pi[i].isFirstItem=!1)},t.onload=this.#jn(this.onload,o),t.onloadend=e=>{delete this.#Pi[i],this.#jn(this.onloadend,o)(e)},t.onerror=this.#jn(this.onerror,o),t.onabort=this.#jn(this.onabort,o);try{t.load(e,r)}catch(e){return this.onerror({error:e,dataid:i}),void this.onloadend({dataid:i})}}#jn(e,t){return function(n){const i=Object.keys(t);for(let e=0;e{this.#Oe.fireEvent(e)};#Ei(e){return t=>{t.dataid=e,this.#Re(t)}}}function li(e){return function(t){return Number(t).toPrecision(e)}}function ci(e){let t="";for(let n=0;n{e.dataid===this.#We&&void 0!==e.data&&void 0!==e.data.imageUid&&this.#Vi!==e.data.imageUid&&(this.#Vi=e.data.imageUid,this.#Gi(e))};#Gi=e=>{if(e.dataid!==this.#We)return;const t=this.#Bi[this.#Vi];if(void 0!==t){for(let n=0;nt?1:e.wheelDeltaY<-t?-1:-e.deltaY/60}}(e)}clear(){this.#ki=0}isTick(){return Math.abs(this.#ki)>=1}}class hi{#qi;#Hi=new Si;constructor(e){this.#qi=e}wheel(e){this.#Hi.add(e);const t=this.#Hi.getSum()>=0;if(!this.#Hi.isTick())return;this.#Hi.clear(),e.preventDefault();const n=Ln(e),i=this.#qi.getLayerGroupByDivId(n.groupDivId),r=i.getActiveViewLayer().getViewController();let o;i.canScroll()?o=t?r.getIncrementScrollPosition():r.getDecrementScrollPosition():i.moreThanOne(3)&&(o=t?r.getIncrementPosition(3):r.getDecrementPosition(3)),void 0!==o&&i.isPositionInBounds(o)&&r.setCurrentPosition(o)}}const gi={t(e){const t=e.split(".");if(2!==t.length)throw new Error("Unexpected translation key length.");if("unit"!==t[0])throw new Error("Unexpected translation key prefix.");return{mm:"mm",cm2:"cm²",degree:"°"}[t[1]]}};class mi{#zi;#Wi;constructor(e,t){this.#zi=e,this.#Wi=t}getBegin(){return this.#zi}getEnd(){return this.#Wi}equals(e){return null!==e&&this.getBegin().equals(e.getBegin())&&this.getEnd().equals(e.getEnd())}getDeltaX(){return this.getEnd().getX()-this.getBegin().getX()}getDeltaY(){return this.getEnd().getY()-this.getBegin().getY()}getLength(){return Math.sqrt(this.getDeltaX()*this.getDeltaX()+this.getDeltaY()*this.getDeltaY())}getWorldLength(e){let t=null;if(null!==e){const n=this.getDeltaX()*e.x,i=this.getDeltaY()*e.y;t=Math.sqrt(n*n+i*i)}return t}getMidpoint(){return new A((this.getBegin().getX()+this.getEnd().getX())/2,(this.getBegin().getY()+this.getEnd().getY())/2)}getSlope(){return this.getDeltaY()/this.getDeltaX()}getIntercept(){return(this.getEnd().getX()*this.getBegin().getY()-this.getBegin().getX()*this.getEnd().getY())/this.getDeltaX()}getInclination(){return 180-180*Math.atan2(this.getDeltaY(),this.getDeltaX())/Math.PI}quantify(e){const t={},n=e.get2DSpacing(),i=this.getWorldLength(n);return null!==i&&(t.length={value:i,unit:gi.t("unit.mm")}),t}}function pi(e,t){const n=e.getDeltaX(),i=e.getDeltaY(),r=t.getDeltaX(),o=t.getDeltaY(),a=n*r+i*o,s=n*o-i*r;return 360-(180-180*Math.atan2(s,a)/Math.PI)}function fi(e,t,n){let i=0,r=0,o=0,a=0;if(0!==e.getSlope()){const s=-1/e.getSlope(),l=t.getY()-s*t.getX(),c=n/(2*Math.sqrt(1+s*s));i=t.getX()-c,r=s*i+l,o=t.getX()+c,a=s*o+l}else i=t.getX(),r=t.getY()-n/2,o=t.getX(),a=t.getY()+n/2;return new mi(new A(i,r),new A(o,a))}function yi(e,t,n,i){const r=i.applyZoomScale(3),o={x:Math.abs(r.x),y:Math.abs(r.y)};return new(an().Ellipse)({x:e,y:t,stroke:"#999",fill:"rgba(100,100,100,0.7",strokeWidth:i.getStrokeWidth(),strokeScaleEnabled:!1,radius:o,radiusX:o.x,radiusY:o.y,name:"anchor",id:n.toString(),dragOnTop:!1,draggable:!0,visible:!1})}class Di{#qi;constructor(e){this.#qi=e}#Yi=null;#Xi=null;#ji=null;#zt;#et=null;#Zi=!1;#_i=null;setFactoryList(e){this.#Yi=e}setShape(e,t,n){if(this.#ji=e,this.#zt=t,this.#et=n,this.#ji){this.#Ki();const e=this.#ji.getParent(),t=Object.keys(this.#Yi);this.#Xi=null;for(let n=0;n{this.#tr(e)}:e=>{this.#nr(e)},this.#er(t)}#Ki(){this.#er((function(e){e.remove()}))}#Ji(){if(!this.#ji||!this.#ji.getLayer())return;const e=this.#ji.getParent(),t=this.#Xi.getAnchors(this.#ji,this.#qi.getStyle());for(let n=0;n{const n=e.target;n instanceof an().Shape&&(t=this.#ir(n),e.cancelBubble=!0)})),e.on("dragmove.edit",(e=>{const t=e.target;t instanceof an().Shape&&(function(e,t){const n=t.getParent();Ci(t,new A(-n.x(),-n.y()),new A(e.x-n.x(),e.y-n.y()))}(this.#zt.getBaseSize(),t),this.#Xi.update(t,this.#qi.getStyle(),this.#et),t.getLayer()?t.getLayer().draw():i.warn("No layer to draw the anchor!"),e.cancelBubble=!0)})),e.on("dragend.edit",(e=>{const i=e.target;if(!(i instanceof an().Shape))return;const r=this.#ir(i),o=new dn(n,this.#Xi,t,r,this.#zt,this.#et,this.#qi.getStyle());o.onExecute=this.#_i,o.onUndo=this.#_i,o.execute(),this.#qi.addToUndoStack(o),t=r,e.cancelBubble=!0})),e.on("mousedown touchstart",(e=>{e.target.moveToTop()})),e.on("mouseover.edit",(e=>{const t=e.target;t instanceof an().Shape&&(t.stroke("#ddd"),t.getLayer()?t.getLayer().draw():i.warn("No layer to draw the anchor!"))})),e.on("mouseout.edit",(e=>{const t=e.target;t instanceof an().Shape&&(t.stroke("#999"),t.getLayer()?t.getLayer().draw():i.warn("No layer to draw the anchor!"))}))}#nr(e){e.off("dragstart.edit"),e.off("dragmove.edit"),e.off("dragend.edit"),e.off("mousedown touchstart"),e.off("mouseover.edit"),e.off("mouseout.edit")}}function Ci(e,t,n){let i=!1;return e.x()n.getX()&&(e.x(n.getX()),i=!0),e.y()n.getY()&&(e.y(n.getY()),i=!0),i}class vi{#rr=[];getPoint(e){return this.#rr[e]}getLength(){return this.#rr.length}addPoint(e){this.#rr.push(e)}addPoints(e){this.#rr=this.#rr.concat(e)}}const Ii={labelText:{arrow:{"*":""},circle:{"*":"{surface}"},ellipse:{"*":"{surface}"},freeHand:{"*":""},protractor:{"*":"{angle}"},rectangle:{"*":"{surface}"},roi:{"*":""},ruler:{"*":"{length}"}}};class Ti{getGroupName(){return"roi-group"}getNPoints(){}getTimeout(){return 100}isFactoryGroup(e){return this.getGroupName()===e.name()}create(e,t,n){const i=new vi;i.addPoints(e);const r=[];for(let e=0;e.33?0:1;t[n][e.data[n].length-2]=1,t[n][e.data[n].length-1]=1}t[e.data.length-2]=[],t[e.data.length-1]=[];for(let n=1;nMath.round(this.searchGran*this.cost[e.y][e.x]);setPoint(e){this.setWorking(!0),this.curPoint=e;let t=0,n=0;for(this.visited=[],n=0;nethis.getMax()?t:e))}}class Mi{getName(){return"Sharpen"}#Sr=null;setOriginalImage(e){this.#Sr=e}getOriginalImage(){return this.#Sr}update(){return this.getOriginalImage().convolute2D([0,-1,0,-1,5,-1,0,-1,0])}}class Qi{getName(){return"Sobel"}#Sr=null;setOriginalImage(e){this.#Sr=e}getOriginalImage(){return this.#Sr}update(){const e=this.getOriginalImage(),t=e.convolute2D([1,0,-1,2,0,-2,1,0,-1]),n=e.convolute2D([1,2,1,0,0,0,-1,-2,-1]);return t.compose(n,(function(e,t){return Math.sqrt(e*e+t*t)}))}}class Bi{#hr;#qi;constructor(e,t){this.#hr=e,this.#qi=t}getName(){return"Filter-"+this.#hr.getName()}execute(){this.#qi.setLastImage(this.#hr.update()),this.#qi.render(this.#qi.getDataIds()[0]);const e={type:"filterrun",id:this.getName()};this.onExecute(e)}undo(){this.#qi.setLastImage(this.#hr.getOriginalImage()),this.#qi.render(this.#qi.getDataIds()[0]);const e={type:"filterundo",id:this.getName()};this.onUndo(e)}onExecute(e){}onUndo(e){}}const Vi={},Ni={WindowLevel:class{#qi;#gr=!1;#mr;#pr;constructor(e){this.#qi=e,this.#pr=new hi(e)}#fr(e){this.#gr=!0,this.#mr=e}#yr(e,t){if(!this.#gr)return;const n=this.#qi.getLayerGroupByDivId(t).getActiveViewLayer().getViewController(),i=e.getX()-this.#mr.getX(),o=this.#mr.getY()-e.getY(),a=n.getImageRescaledDataRange(),s=.01*(a.max-a.min),l=n.getWindowLevel().center,c=n.getWindowLevel().width,u=l+Math.round(o*s);let d=c+Math.round(i*s);var S;d=(S=d)<1?1:S;const h=new r(u,d);n.setWindowLevel(h),this.#mr=e}#Dr(){this.#gr&&(this.#gr=!1)}mousedown=e=>{const t=tn(e);this.#fr(t)};mousemove=e=>{const t=tn(e),n=Ln(e);this.#yr(t,n.groupDivId)};mouseup=e=>{this.#Dr()};mouseout=e=>{this.#Dr()};touchstart=e=>{const t=en(e);this.#fr(t[0])};touchmove=e=>{const t=en(e),n=Ln(e);this.#yr(t[0],n.groupDivId)};touchend=e=>{this.#Dr()};dblclick=e=>{const t=Ln(e),n=tn(e),i=this.#qi.getLayerGroupByDivId(t.groupDivId).getActiveViewLayer(),o=i.displayToPlaneIndex(n),a=i.getViewController(),s=this.#qi.getImage(i.getDataId()),l=new r(s.getRescaledValueAtIndex(a.getCurrentIndex().getWithNew2D(o.get(0),o.get(1))),a.getWindowLevel().width);a.setWindowLevel(l)};wheel=e=>{this.#pr.wheel(e)};keydown=e=>{e.context="WindowLevel",this.#qi.onKeydown(e)};activate(e){}init(){}setFeatures(e){}},Scroll:class{#qi;#gr=!1;#mr;#pr;#Cr;#vr=!1;constructor(e){this.#qi=e,this.#pr=new hi(e)}#fr(e,t){this.#Ir();const n=this.#qi.getLayerGroupByDivId(t).getActiveViewLayer(),i=n.getViewController();i.isPlaying()&&i.stop(),this.#gr=!0,this.#mr=e;const r=n.displayToPlanePos(e),o=i.getPositionFromPlanePoint(r);i.setCurrentPosition(o)}#yr(e,t){if(!this.#gr)return void(this.#vr&&this.#Tr(e,t));const n=this.#qi.getLayerGroupByDivId(t),i=n.getActiveViewLayer().getViewController();let r;const o=e.getY()-this.#mr.getY(),a=Math.abs(o)>15;a&&n.canScroll()&&(r=o>0?i.getDecrementScrollPosition():i.getIncrementScrollPosition());const s=e.getX()-this.#mr.getX(),l=Math.abs(s)>15;l&&n.moreThanOne(3)&&(r=s>0?i.getIncrementPosition(3):i.getDecrementPosition(3)),void 0!==r&&n.isPositionInBounds(r)&&i.setCurrentPosition(r),(l||a)&&(this.#mr=e)}#Dr(){this.#gr&&(this.#gr=!1)}mousedown=e=>{const t=tn(e),n=Ln(e);this.#fr(t,n.groupDivId)};mousemove=e=>{const t=tn(e),n=Ln(e);this.#yr(t,n.groupDivId)};mouseup=e=>{this.#Dr()};mouseout=e=>{this.#Dr(),this.#Ir()};touchstart=e=>{this.#Cr=setTimeout((()=>{this.dblclick(e)}),500);const t=en(e),n=Ln(e);this.#fr(t[0],n.groupDivId)};touchmove=e=>{null!==this.#Cr&&(clearTimeout(this.#Cr),this.#Cr=null);const t=en(e),n=Ln(e);this.#yr(t[0],n.groupDivId)};touchend=e=>{null!==this.#Cr&&(clearTimeout(this.#Cr),this.#Cr=null),this.#Dr()};wheel=e=>{this.#pr.wheel(e)};keydown=e=>{e.context="Scroll",this.#qi.onKeydown(e)};dblclick=e=>{const t=Ln(e);this.#qi.getLayerGroupByDivId(t.groupDivId).getActiveViewLayer().getViewController().play()};#Tr(e,t){this.#Ir();const n=this.#qi.getLayerGroupByDivId(t).getActiveViewLayer(),i=n.getViewController(),r=n.displayToPlanePos(e),o=i.getPositionFromPlanePoint(r),a=i.getRescaledImageValue(o);if(void 0!==a){const t=document.createElement("span");t.id="scroll-tooltip",document.getElementById(n.getId()).parentElement.appendChild(t),t.style.left=e.getX()+10+"px",t.style.top=e.getY()+10+"px";let r=Q(a,3).toString();void 0!==i.getPixelUnit()&&(r+=" "+i.getPixelUnit()),t.appendChild(document.createTextNode(r))}}#Ir(){const e=document.getElementById("scroll-tooltip");e&&e.remove()}activate(e){e||this.#Ir()}setFeatures(e){void 0!==e.displayTooltip&&(this.#vr=e.displayTooltip)}init(){}},ZoomAndPan:class{#qi;#gr=!1;#mr;#Lr;#Pr;constructor(e){this.#qi=e}#fr(e){this.#gr=!0,this.#mr=e}#wr=e=>{this.#gr=!0,this.#mr=e[0],this.#Lr=new mi(e[0],e[1]),this.#Pr=this.#Lr.getMidpoint()};#yr(e,t){if(!this.#gr)return;const n=e.getX()-this.#mr.getX(),i=e.getY()-this.#mr.getY(),r=this.#qi.getLayerGroupByDivId(t),o=r.getActiveViewLayer(),a=o.getViewController(),s=o.displayToPlaneScale(new A(n,i)),l=a.getOffset3DFromPlaneOffset({x:s.getX(),y:s.getY()});r.addTranslation({x:l.getX(),y:l.getY(),z:l.getZ()}),r.draw(),this.#mr=e}#Or=(e,t)=>{if(!this.#gr)return;const n=new mi(e[0],e[1]).getLength()/this.#Lr.getLength(),i=this.#qi.getLayerGroupByDivId(t),r=i.getActiveViewLayer(),o=r.getViewController();if(1===n){const t=e[0].getY()-this.#mr.getY();if(Math.abs(t)<15)return;if(i.canScroll()){let e;e=t>0?o.getIncrementScrollPosition():o.getDecrementScrollPosition(),void 0!==e&&i.isPositionInBounds(e)&&o.setCurrentPosition(e)}}else{const e=(n-1)/10;if(Math.abs(e)%.1<=.05&&void 0!==this.#Pr){const t=r.displayToMainPlanePos(this.#Pr),n=o.getPlanePositionFromPlanePoint(t);i.addScale(e,n),i.draw()}}};#Dr(){this.#gr&&(this.#gr=!1)}mousedown=e=>{const t=tn(e);this.#fr(t)};mousemove=e=>{const t=tn(e),n=Ln(e);this.#yr(t,n.groupDivId)};mouseup=e=>{this.#Dr()};mouseout=e=>{this.#Dr()};touchstart=e=>{const t=en(e);1===t.length?this.#fr(t[0]):2===t.length&&this.#wr(t)};touchmove=e=>{const t=en(e),n=Ln(e);1===t.length?this.#yr(t[0],n.groupDivId):2===t.length&&this.#Or(t,n.groupDivId)};touchend=e=>{this.#Dr()};wheel=e=>{e.preventDefault();const t=-e.deltaY/500,n=Ln(e),i=tn(e),r=this.#qi.getLayerGroupByDivId(n.groupDivId),o=r.getActiveViewLayer(),a=o.getViewController(),s=o.displayToMainPlanePos(i),l=a.getPlanePositionFromPlanePoint(s);r.addScale(t,l),r.draw()};keydown=e=>{e.context="ZoomAndPan",this.#qi.onKeydown(e)};activate(e){}init(){}setFeatures(e){}},Opacity:class{#qi;#gr=!1;#mr;#pr;constructor(e){this.#qi=e,this.#pr=new hi(e)}#fr(e){this.#gr=!0,this.#mr=e}#yr(e,t){if(!this.#gr)return;const n=e.getX()-this.#mr.getX();if(Math.abs(n)>15){const i=this.#qi.getLayerGroupByDivId(t).getActiveViewLayer(),r=i.getOpacity();i.setOpacity(r+n/200),i.draw(),this.#mr=e}}#Dr(){this.#gr&&(this.#gr=!1)}mousedown=e=>{const t=tn(e);this.#fr(t)};mousemove=e=>{const t=tn(e),n=Ln(e);this.#yr(t,n.groupDivId)};mouseup=e=>{this.#Dr()};mouseout=e=>{this.#Dr()};touchstart=e=>{const t=en(e);this.#fr(t[0])};touchmove=e=>{const t=en(e),n=Ln(e);this.#yr(t[0],n.groupDivId)};touchend=e=>{this.#Dr()};wheel=e=>{this.#pr.wheel(e)};keydown=e=>{e.context="Opacity",this.#qi.onKeydown(e)};activate(e){}init(){}setFeatures(e){}},Draw:class{#qi;#pr;#Ar;#br;#Ht;constructor(e){this.#qi=e,this.#pr=new hi(e),this.#Ar=new Di(e),this.#Ar.setDrawEventCallback(this.#Re),this.#Ht=e.getStyle(),this.#br=new(an().Group);const t=new(an().Line)({points:[-10,-10,10,10],stroke:"red"}),n=new(an().Line)({points:[10,-10,-10,10],stroke:"red"});this.#br.width(20),this.#br.height(20),this.#br.add(t),this.#br.add(n)}#gr=!1;#Yi=null;#Xi=null;#xr=null;#Rr=null;#Fr;#rr=[];#Er=null;#qr;#Ur;#Mr="pointer";#Qr=!0;#Br=!0;#H={};#Vr=!1;#fr(e,t){if(this.#gr)return;const n=this.#qi.getLayerGroupByDivId(t),i=n.getActiveDrawLayer(),r=i.getKonvaStage(),o=r.getIntersection({x:e.getX(),y:e.getY()});if(this.#Ht.setZoomScale(r.scale()),o){const e=o.getParent().find(".shape")[0];if(e&&e instanceof an().Shape&&e!==this.#Ar.getShape()){this.#Ar.disable();const t=n.getActiveViewLayer().getViewController();this.#Ar.setShape(e,i,t),this.#Ar.enable()}}else{this.#Ar.disable(),this.#Ar.reset(),this.#gr=!0,this.#Xi=new this.#Yi[this.#Fr],this.#rr=[];const t=n.getActiveViewLayer();this.#Er=t.displayToPlanePos(e),this.#rr.push(this.#Er)}}#yr(e,t){if(!this.#gr)return;const n=this.#qi.getLayerGroupByDivId(t),i=n.getActiveViewLayer().displayToPlanePos(e);(Math.abs(i.getX()-this.#Er.getX())>0||Math.abs(i.getY()-this.#Er.getY())>0)&&(this.#Vr&&this.#rr.pop(),this.#Er=i,this.#Vr=!0,this.#rr.push(this.#Er),this.#Nr(this.#rr,n))}#Dr(e){if(this.#gr)if(0!==this.#rr.length){if(this.#rr.length===this.#Xi.getNPoints()){const t=this.#qi.getLayerGroupByDivId(e);this.#Gr(this.#rr,t),this.#gr=!1}this.#Vr=!1}else i.warn("Draw mouseup but no points...")}mousedown=e=>{const t=tn(e),n=Ln(e);this.#fr(t,n.groupDivId)};mousemove=e=>{const t=tn(e),n=Ln(e);this.#yr(t,n.groupDivId)};mouseup=e=>{const t=Ln(e);this.#Dr(t.groupDivId)};dblclick=e=>{if(void 0!==this.#Xi.getNPoints())return;if(!this.#gr)return;if(0===this.#rr.length)return void i.warn("Draw dblclick but no points...");const t=Ln(e),n=this.#qi.getLayerGroupByDivId(t.groupDivId);this.#Gr(this.#rr,n),this.#gr=!1};mouseout=e=>{const t=Ln(e);this.#Dr(t.groupDivId)};touchstart=e=>{const t=en(e),n=Ln(e);this.#fr(t[0],n.groupDivId)};touchmove=e=>{if(!this.#gr)return;const t=Ln(e),n=en(e),i=this.#qi.getLayerGroupByDivId(t.groupDivId),r=i.getActiveViewLayer().displayToPlanePos(n[0]);(Math.abs(r.getX()-this.#Er.getX())>0||Math.abs(r.getY()-this.#Er.getY())>0)&&(1!==this.#rr.length&&this.#rr.pop(),this.#Er=r,this.#rr.push(this.#Er),this.#rr.length{this.#rr.push(this.#Er)}),this.#Xi.getTimeout())),this.#Nr(this.#rr,i))};touchend=e=>{this.dblclick(e)};wheel=e=>{this.#Qr&&this.#pr.wheel(e)};keydown=e=>{if(this.#gr||(e.context="Draw",this.#qi.onKeydown(e)),("Delete"===e.key||"Backspace"===e.key)&&this.#Ar.isActive()){const e=this.#Ar.getShape().getParent();if(!(e instanceof an().Group))return;const t=e.getChildren(mn)[0];if(!(t instanceof an().Shape))return;const n=ln(t),i=this.#qi.getActiveLayerGroup().getActiveDrawLayer(),r=new Sn(e,n,i);r.onExecute=this.#Re,r.onUndo=this.#Re,r.execute(),this.#qi.addToUndoStack(r)}if("Escape"===e.key&&null!==this.#Rr){const e=this.#Rr.getLayer();this.#Rr.destroy(),this.#Rr=null,this.#gr=!1,this.#rr=[],e.draw()}};#Nr(e,t){const n=t.getActiveDrawLayer().getKonvaLayer();this.#Rr&&(this.#Rr.destroy(),this.#Rr=null);const i=t.getActiveViewLayer();if(this.#Br){const e=["#ffff80","#ff80ff","#80ffff","#80ff80","8080ff","ff8080"],t=i.getId(),n=t.substring(t.length-1),r=e[parseInt(n,10)/2];void 0!==r&&this.#Ht.setLineColour(r)}const r=i.getViewController();this.#Rr=this.#Xi.create(e,this.#Ht,r),this.#Rr.getChildren(mn)[0].listening(!1),n.listening(!1),n.add(this.#Rr),n.draw()}#Gr(e,t){this.#Rr&&(this.#Rr.destroy(),this.#Rr=null);const n=t.getActiveDrawLayer(),i=n.getKonvaLayer(),r=n.getDrawController(),o=t.getActiveViewLayer().getViewController(),a=this.#Xi.create(e,this.#Ht,o);a.id($e()),r.getCurrentPosGroup().add(a),i.listening(!0),this.#xr=new cn(a,this.#Fr,n),this.#xr.onExecute=this.#Re,this.#xr.onUndo=this.#Re,this.#xr.execute(),this.#qi.addToUndoStack(this.#xr),this.setShapeOn(a,t)}activate(e){this.#Ar.disable(),this.#Ar.reset();const t=this.#qi.getActiveLayerGroup();this.#kr(e,t),e?(this.#Ur=document.body.style.cursor,this.#qi.addEventListener("positionchange",(()=>{this.#Hr(t)}))):(this.#zr(),this.#Ur=void 0,this.#qi.removeEventListener("positionchange",(()=>{this.#Hr(t)})))}#Hr(e){this.#kr(!0,e)}#kr(e,t){const n=t.getActiveDrawLayer();if(void 0===n)return;const i=n.getDrawController().getCurrentPosGroup().getChildren();e?i.forEach((e=>{this.setShapeOn(e,t)})):i.forEach((e=>{this.#Wr(e)}));const r=n.getKonvaLayer();0!==i.length&&r.listening(!0),r.draw()}#Wr(e){e.off("mouseover"),e.off("mouseout"),e.draggable(!1),e.off("dragstart.draw"),e.off("dragmove.draw"),e.off("dragend.draw"),e.off("dblclick")}#Yr(e,t){const n=t.getActiveDrawLayer().getKonvaStage();return{x:n.offset().x+e.x/n.scale().x,y:n.offset().y+e.y/n.scale().y}}#zr(){void 0!==this.#Ur&&(document.body.style.cursor=this.#Ur),void 0!==this.#qr&&this.#qr.opacity(1)}setShapeOn(e,t){const n=()=>{document.body.style.cursor=this.#Mr,e.opacity(.75)};e.on("mouseover",(()=>{this.#qr=e,n()})),e.on("mouseout",(()=>{this.#zr(),this.#qr=void 0}));const i=t.getActiveDrawLayer(),r=i.getKonvaLayer();e.draggable(!0);let o={x:e.x(),y:e.y()};const a=e.getChildren(mn)[0];if(!(a instanceof an().Shape))return;const s=ln(a);let l=null;e.on("dragstart.draw",(()=>{const t=e.getChildren(mn)[0];if(!(t instanceof an().Shape))return;l=t.stroke();const n=i.getKonvaStage(),o=n.scale(),a={x:1/o.x,y:1/o.y};this.#br.x(n.offset().x+n.width()/(2*o.x)),this.#br.y(n.offset().y+n.height()/(15*o.y)),this.#br.scale(a),r.add(this.#br),this.#Ar.setAnchorsActive(!1),r.draw()})),e.on("dragmove.draw",(n=>{const o=n.target;if(!(o instanceof an().Group))return;let a;!function(e,t){const n=t.getChildren(mn)[0],i=function(e){const t=e.find(".anchor");if(0===t.length)return;let n=t[0].x(),i=t[0].y();for(let e=0;e{const a=n.target;if(!(a instanceof an().Group))return;if(this.#br.remove(),void 0===n||void 0===n.evt)return;const c=a.x(),u=a.y(),d=tn(n.evt),S={x:d.getX(),y:d.getY()},h=this.#Yr(S,t),g=this.#br.width()*Math.abs(this.#br.scaleX())/2,m=this.#br.height()*Math.abs(this.#br.scaleY())/2;if(Math.abs(h.x-this.#br.x()){const t=e.currentTarget;if(!(t instanceof an().Group))return;const n=t.findOne("Label");if(!(n instanceof an().Label))return;if(void 0===n)throw new Error("Could not find the shape label.");const o=n.getText(),a=t.id();Jt.openRoiDialog(o.meta,(e=>{o.meta=e,o.setText(q(e.textExpr,e.quantification)),n.visible(0!==e.textExpr.length),this.#Re({type:"drawchange",id:a,srclayerid:i.getId(),dataid:i.getDataId()}),r.draw()}))}))}setOptions(e){this.#Yi=e,this.#Ar.setFactoryList(e)}getOptionsType(){return"factory"}setFeatures(e){if(void 0!==e.autoShapeColour&&(this.#Br=e.autoShapeColour),void 0!==e.shapeColour&&(this.#Ht.setLineColour(e.shapeColour),this.#Br=!1),void 0!==e.shapeName){if(!this.hasShape(e.shapeName))throw new Error("Unknown shape: '"+e.shapeName+"'");this.#Fr=e.shapeName}void 0!==e.mouseOverCursor&&(this.#Mr=e.mouseOverCursor),void 0!==e.withScroll&&(this.#Qr=e.withScroll)}init(){}getEventNames(){return["drawcreate","drawchange","drawmove","drawdelete"]}addEventListener(e,t){void 0===this.#H[e]&&(this.#H[e]=[]),this.#H[e].push(t)}removeEventListener(e,t){if(void 0!==this.#H[e])for(let n=0;n{if(void 0!==this.#H[e.type])for(let t=0;t{e.context="Filter",this.#qi.onKeydown(e)};getEventNames(){return["filterrun","filterundo"]}addEventListener(e,t){this.#Oe.add(e,t)}removeEventListener(e,t){this.#Oe.remove(e,t)}#Re=e=>{this.#Oe.fireEvent(e)};getSelectedFilter(){return this.#jr}setFeatures(e){if(void 0!==e.filterName){if(!this.hasFilter(e.filterName))throw new Error("Unknown filter: '"+e.filterName+"'");this.#jr&&this.#jr.activate(!1),this.#jr=this.#Xr[e.filterName],this.#jr.activate(!0)}if(void 0!==e.run&&e.run){let t={};void 0!==e.runArgs&&(t=e.runArgs),this.getSelectedFilter().run(t)}}getFilterList(){return this.#Xr}hasFilter(e){return this.#Xr[e]}},Floodfill:class{#qi;constructor(e){this.#qi=e}#Zr=5;#_r=0;#Kr=2e3;#Jr=null;#$r=null;#eo=10;#to=null;#gr=!1;#xr=null;#no=null;#io;#ro=null;#oo=[];#ao=!1;#so;#Ht=new sn;#Oe=new ke;setExtend(e){this.#ao=e}getExtend(){return this.#ao}#lo=(e,t)=>{const n=this.#qi.getLayerGroupByDivId(t).getActiveViewLayer().displayToPlaneIndex(e);return{x:n.get(0),y:n.get(1)}};#co(e,t,n){this.#oo=[];const i={data:this.#Jr.data,width:this.#Jr.width,height:this.#Jr.height,bytes:4};this.#$r=Pi().floodFill(i,e.x,e.y,t),this.#$r=Pi().gaussBlurOnlyBorder(this.#$r,this.#Zr);let r=Pi().traceContours(this.#$r);if(r=Pi().simplifyContours(r,this.#_r,this.#Kr),r.length>0&&r[0].points[0].x){if(n)return r[0].points;for(let e=0,t=r[0].points.length;eo&&this.#uo(this.#io,a,n);t--)i.decrementIndex(2);i.setCurrentPosition(r)}modifyThreshold(e,t){if(t||!this.#no)throw"No shape found";t=this.#no.getChildren((function(e){return"shape"===e.name()}))[0],clearTimeout(this.#so),this.#so=setTimeout((()=>{if(this.#ro=this.#co(this.#io,e,!0),!this.#ro)return!1;const n=[];for(let e=0,t=this.#ro.length;e{const t=tn(e),n=Ln(e);this.#fr(t,n.groupDivId)};mousemove=e=>{const t=tn(e),n=Ln(e);this.#yr(t,n.groupDivId)};mouseup=e=>{this.#Dr()};mouseout=e=>{this.#Dr()};touchstart=e=>{const t=en(e),n=Ln(e);this.#fr(t[0],n.groupDivId)};touchmove=e=>{const t=en(e),n=Ln(e);this.#yr(t[0],n.groupDivId)};touchend=e=>{this.#Dr()};keydown=e=>{e.context="Floodfill",this.#qi.onKeydown(e)};activate(e){e&&(this.#Ht.setBaseScale(this.#qi.getBaseScale()),this.setFeatures({shapeColour:this.#Ht.getLineColour()}))}init(){}getEventNames(){return["drawcreate","drawchange","drawmove","drawdelete"]}addEventListener(e,t){this.#Oe.add(e,t)}removeEventListener(e,t){this.#Oe.remove(e,t)}#Re=e=>{this.#Oe.fireEvent(e)};setFeatures(e){void 0!==e.shapeColour&&this.#Ht.setLineColour(e.shapeColour)}},Livewire:class{#qi;constructor(e){this.#qi=e}#gr=!1;#mr;#xr=null;#no=null;#Ht=new sn;#do=new wi;#So=new wi;#oo=[];#ho=5;#Oe=new ke;#go(e){const t=e.get(1);for(let e=0;e{const t=tn(e),n=Ln(e);this.#fr(t,n.groupDivId)};mousemove=e=>{const t=tn(e),n=Ln(e);this.#yr(t,n.groupDivId)};mouseup(e){}mouseout=e=>{};dblclick=e=>{this.#fo()};touchstart=e=>{const t=en(e),n=Ln(e);this.#fr(t[0],n.groupDivId)};touchmove=e=>{const t=en(e),n=Ln(e);this.#yr(t[0],n.groupDivId)};touchend=e=>{};keydown=e=>{e.context="Livewire",this.#qi.onKeydown(e)};activate(e){if(e){const e=this.#qi.getActiveLayerGroup().getActiveViewLayer(),t=e.getViewController().getImageSize();this.#po.setDimensions(t.get(0),t.get(1)),this.#po.setData(e.getImageData().data),this.#Ht.setBaseScale(this.#qi.getBaseScale()),this.setFeatures({shapeColour:this.#Ht.getLineColour()})}}init(){}getEventNames(){return["drawcreate","drawchange","drawmove","drawdelete"]}addEventListener(e,t){this.#Oe.add(e,t)}removeEventListener(e,t){this.#Oe.remove(e,t)}#Re=e=>{this.#Oe.fireEvent(e)};setFeatures(e){void 0!==e.shapeColour&&this.#Ht.setLineColour(e.shapeColour)}}},Gi={draw:{ArrowFactory:class{getGroupName(){return"line-group"}getNPoints(){return 2}getTimeout(){return 0}isFactoryGroup(e){return this.getGroupName()===e.name()}create(e,t,n){const i=new mi(e[0],e[1]),r=new(an().Line)({points:[i.getBegin().getX(),i.getBegin().getY(),i.getEnd().getX(),i.getEnd().getY()],stroke:t.getLineColour(),strokeWidth:t.getStrokeWidth(),strokeScaleEnabled:!1,name:"shape"}),o=fi(i,e[0],t.scale(10)),a=fi(i,e[1],t.scale(10));r.hitFunc((function(e){e.beginPath(),e.moveTo(o.getBegin().getX(),o.getBegin().getY()),e.lineTo(o.getEnd().getX(),o.getEnd().getY()),e.lineTo(a.getEnd().getX(),a.getEnd().getY()),e.lineTo(a.getBegin().getX(),a.getBegin().getY()),e.closePath(),e.fillStrokeShape(r)}));const s=new A(i.getBegin().getX(),i.getBegin().getY()-10),l=new mi(i.getBegin(),s),c=pi(i,l),u=c*Math.PI/180,d=5*t.getScaledStrokeWidth(),S=new(an().RegularPolygon)({x:i.getBegin().getX()+d*Math.sin(u),y:i.getBegin().getY()+d*Math.cos(u),sides:3,radius:d,rotation:-c,fill:t.getLineColour(),strokeWidth:t.getStrokeWidth(),strokeScaleEnabled:!1,name:"shape-triangle"}),h=new(an().Text)({fontSize:t.getFontSize(),fontFamily:t.getFontFamily(),fill:t.getLineColour(),padding:t.getTextPadding(),shadowColor:t.getShadowLineColour(),shadowOffset:t.getShadowOffset(),name:"text"});let g="";const m=n.getModality();g=void 0!==Ii.labelText.arrow[m]?Ii.labelText.arrow[m]:Ii.labelText.arrow["*"],h.setText(g),h.meta={textExpr:g,quantification:{}};const p=i.getBegin().getX()>i.getEnd().getX()?0:-1,f=i.getBegin().getY()>i.getEnd().getY()?-1:0,y=new(an().Label)({x:i.getEnd().getX()+p*h.width(),y:i.getEnd().getY()+f*t.applyZoomScale(15).y,scale:t.applyZoomScale(1),visible:0!==g.length,name:"label"});y.add(h),y.add(new(an().Tag)({fill:t.getLineColour(),opacity:t.getTagOpacity()}));const D=new(an().Group);return D.name(this.getGroupName()),D.add(y),D.add(S),D.add(r),D.visible(!0),D}getAnchors(e,t){const n=e.points(),i=[];return i.push(yi(n[0]+e.x(),n[1]+e.y(),"begin",t)),i.push(yi(n[2]+e.x(),n[3]+e.y(),"end",t)),i}update(e,t,n){const i=e.getParent(),r=i.getChildren((function(e){return"shape"===e.name()}))[0];if(!(r instanceof an().Line))return;const o=i.getChildren((function(e){return"shape-triangle"===e.name()}))[0];if(!(o instanceof an().RegularPolygon))return;const a=i.getChildren((function(e){return"label"===e.name()}))[0];if(!(a instanceof an().Label))return;const s=i.getChildren((function(e){return"begin"===e.id()}))[0],l=i.getChildren((function(e){return"end"===e.id()}))[0];switch(e.id()){case"begin":s.x(e.x()),s.y(e.y());break;case"end":l.x(e.x()),l.y(e.y())}const c=s.x()-r.x(),u=s.y()-r.y(),d=l.x()-r.x(),S=l.y()-r.y();r.points([c,u,d,S]);const h=new A(s.x(),s.y()),g=new A(l.x(),l.y()),m=new mi(h,g),p=new A(c,u),f=new A(d,S),y=fi(m,p,10),D=fi(m,f,10);r.hitFunc((function(e){e.beginPath(),e.moveTo(y.getBegin().getX(),y.getBegin().getY()),e.lineTo(y.getEnd().getX(),y.getEnd().getY()),e.lineTo(D.getEnd().getX(),D.getEnd().getY()),e.lineTo(D.getBegin().getX(),D.getBegin().getY()),e.closePath(),e.fillStrokeShape(r)}));const C=new A(m.getBegin().getX(),m.getBegin().getY()-10),v=new mi(m.getBegin(),C),I=pi(m,v),T=I*Math.PI/180;o.x(m.getBegin().getX()+o.radius()*Math.sin(T)),o.y(m.getBegin().getY()+o.radius()*Math.cos(T)),o.rotation(-I);const L=a.getText();L.setText(L.meta.textExpr);const P=m.getBegin().getX()>m.getEnd().getX()?0:-1,w=m.getBegin().getY()>m.getEnd().getY()?-1:0,O={x:m.getEnd().getX()+P*L.width(),y:m.getEnd().getY()+w*t.applyZoomScale(15).y};a.position(O)}},CircleFactory:class{getGroupName(){return"circle-group"}getNPoints(){return 2}getTimeout(){return 0}isFactoryGroup(e){return this.getGroupName()===e.name()}create(e,t,n){const i=Math.abs(e[0].getX()-e[1].getX()),r=Math.abs(e[0].getY()-e[1].getY()),o=Math.round(Math.sqrt(i*i+r*r)),a=new Ri(e[0],o),s=new(an().Circle)({x:a.getCenter().getX(),y:a.getCenter().getY(),radius:a.getRadius(),stroke:t.getLineColour(),strokeWidth:t.getStrokeWidth(),strokeScaleEnabled:!1,name:"shape"}),l=new(an().Text)({fontSize:t.getFontSize(),fontFamily:t.getFontFamily(),fill:t.getLineColour(),padding:t.getTextPadding(),shadowColor:t.getShadowLineColour(),shadowOffset:t.getShadowOffset(),name:"text"});let c="";const u=n.getModality();c=void 0!==Ii.labelText.circle[u]?Ii.labelText.circle[u]:Ii.labelText.circle["*"];const d=a.quantify(n,E(c));l.setText(q(c,d)),l.meta={textExpr:c,quantification:d};const S=new(an().Label)({x:a.getCenter().getX()-a.getRadius(),y:a.getCenter().getY()+a.getRadius(),scale:t.applyZoomScale(1),visible:0!==c.length,name:"label"});S.add(l),S.add(new(an().Tag)({fill:t.getLineColour(),opacity:t.getTagOpacity()}));const h=new(an().Group);return h.name(this.getGroupName()),h.add(S),h.add(s),h.visible(!0),h}getAnchors(e,t){const n=e.x(),i=e.y(),r=e.radius(),o=[];return o.push(yi(n-r,i,"left",t)),o.push(yi(n+r,i,"right",t)),o.push(yi(n,i+r,"bottom",t)),o.push(yi(n,i-r,"top",t)),o}update(e,t,n){const r=e.getParent();if(!(r instanceof an().Group))return;const o=r.getChildren((function(e){return"shape"===e.name()}))[0];if(!(o instanceof an().Circle))return;const a=r.getChildren((function(e){return"label"===e.name()}))[0],s=r.getChildren((function(e){return"left"===e.id()}))[0],l=r.getChildren((function(e){return"right"===e.id()}))[0],c=r.getChildren((function(e){return"bottom"===e.id()}))[0],u=r.getChildren((function(e){return"top"===e.id()}))[0];const d=o.x(),S=o.y();let h;switch(e.id()){case"left":h=d-e.x(),s.x(e.x()),s.y(l.y()),l.x(d+h),c.y(S+h),u.y(S-h);break;case"right":h=e.x()-d,l.x(e.x()),l.y(s.y()),s.x(d-h),c.y(S+h),u.y(S-h);break;case"bottom":h=e.y()-S,c.x(u.x()),c.y(e.y()),s.x(d-h),l.x(d+h),u.y(S-h);break;case"top":h=S-e.y(),u.x(c.x()),u.y(e.y()),s.x(d-h),l.x(d+h),c.y(S+h);break;default:i.error("Unhandled anchor id: "+e.id())}o.radius(Math.abs(h));const g=new A(r.x()+d,r.y()+S),m=(new Ri(g,h),{x:d-Math.abs(h),y:S+Math.abs(h)});a.position(m),this.#yo(r,n)}updateQuantification(e,t){this.#yo(e,t)}#yo(e,t){const n=e.getChildren((function(e){return"shape"===e.name()}))[0];if(!(n instanceof an().Circle))return;const i=e.getChildren((function(e){return"label"===e.name()}))[0];if(!(i instanceof an().Label))return;const r=new A(e.x()+n.x(),e.y()+n.y()),o=new Ri(r,n.radius()),a=i.getText(),s=a.meta,l=o.quantify(t,E(s.textExpr));a.setText(q(s.textExpr,l)),s.quantification=l}#Do(e,t){let n=0,i=0;void 0!==t&&(n=t.x(),i=t.y());const r=new(an().Group);r.name("shadow");const o=e.getRound();for(let e=0;e180&&(s=360-s,l+=s);const c=new(an().Text)({fontSize:t.getFontSize(),fontFamily:t.getFontFamily(),fill:t.getLineColour(),padding:t.getTextPadding(),shadowColor:t.getShadowLineColour(),shadowOffset:t.getShadowOffset(),name:"text"});let u="";const d=n.getModality();u=void 0!==Ii.labelText.protractor[d]?Ii.labelText.protractor[d]:Ii.labelText.protractor["*"];const S={angle:{value:s,unit:gi.t("unit.degree")}};c.setText(q(u,S)),c.meta={textExpr:u,quantification:S};const h=(i.getMidpoint().getX()+r.getMidpoint().getX())/2,g=(i.getMidpoint().getY()+r.getMidpoint().getY())/2,m=new(an().Label)({x:h,y:g-t.applyZoomScale(15).y,scale:t.applyZoomScale(1),visible:0!==u.length,name:"label"});m.add(c),m.add(new(an().Tag)({fill:t.getLineColour(),opacity:t.getTagOpacity()}));const p=33*Math.min(i.getLength(),r.getLength())/100,f=new(an().Arc)({innerRadius:p,outerRadius:p,stroke:t.getLineColour(),strokeWidth:t.getStrokeWidth(),strokeScaleEnabled:!1,angle:s,rotation:-l,x:e[1].getX(),y:e[1].getY(),name:"shape-arc"});a.add(m),a.add(f)}return a.add(o),a.visible(!0),a}getAnchors(e,t){const n=e.points(),i=[];return i.push(yi(n[0]+e.x(),n[1]+e.y(),"begin",t)),i.push(yi(n[2]+e.x(),n[3]+e.y(),"mid",t)),i.push(yi(n[4]+e.x(),n[5]+e.y(),"end",t)),i}update(e,t,n){const i=e.getParent(),r=i.getChildren((function(e){return"shape"===e.name()}))[0];if(!(r instanceof an().Line))return;const o=i.getChildren((function(e){return"label"===e.name()}))[0];if(!(o instanceof an().Label))return;const a=i.getChildren((function(e){return"shape-arc"===e.name()}))[0];if(!(a instanceof an().Arc))return;const s=i.getChildren((function(e){return"begin"===e.id()}))[0],l=i.getChildren((function(e){return"mid"===e.id()}))[0],c=i.getChildren((function(e){return"end"===e.id()}))[0];switch(e.id()){case"begin":s.x(e.x()),s.y(e.y());break;case"mid":l.x(e.x()),l.y(e.y());break;case"end":c.x(e.x()),c.y(e.y())}const u=s.x()-r.x(),d=s.y()-r.y(),S=l.x()-r.x(),h=l.y()-r.y(),g=c.x()-r.x(),m=c.y()-r.y();r.points([u,d,S,h,g,m]),r.hitFunc((function(e){e.beginPath(),e.moveTo(u,d),e.lineTo(S,h),e.lineTo(g,m),e.closePath(),e.fillStrokeShape(r)}));const p=new A(s.x(),s.y()),f=new A(l.x(),l.y()),y=new A(c.x(),c.y()),D=new mi(p,f),C=new mi(f,y);let v=pi(D,C),I=D.getInclination();v>180&&(v=360-v,I+=v);const T=o.getText(),L=T.meta,P={angle:{value:v,unit:gi.t("unit.degree")}};T.setText(q(L.textExpr,P)),L.quantification=P;const w={x:(D.getMidpoint().getX()+C.getMidpoint().getX())/2,y:(D.getMidpoint().getY()+C.getMidpoint().getY())/2-t.applyZoomScale(15).y};o.position(w);const O=33*Math.min(D.getLength(),C.getLength())/100;a.innerRadius(O),a.outerRadius(O),a.angle(v),a.rotation(-I);const b={x:l.x(),y:l.y()};a.position(b)}},RectangleFactory:class{getGroupName(){return"rectangle-group"}getNPoints(){return 2}getTimeout(){return 0}isFactoryGroup(e){return this.getGroupName()===e.name()}create(e,t,n){const i=new qi(e[0],e[1]),r=new(an().Rect)({x:i.getBegin().getX(),y:i.getBegin().getY(),width:i.getWidth(),height:i.getHeight(),stroke:t.getLineColour(),strokeWidth:t.getStrokeWidth(),strokeScaleEnabled:!1,name:"shape"}),o=new(an().Text)({fontSize:t.getFontSize(),fontFamily:t.getFontFamily(),fill:t.getLineColour(),padding:t.getTextPadding(),shadowColor:t.getShadowLineColour(),shadowOffset:t.getShadowOffset(),name:"text"});let a="";const s=n.getModality();a=void 0!==Ii.labelText.rectangle[s]?Ii.labelText.rectangle[s]:Ii.labelText.rectangle["*"];const l=i.quantify(n,E(a));o.setText(q(a,l)),o.meta={textExpr:a,quantification:l};const c=new(an().Label)({x:i.getBegin().getX(),y:i.getEnd().getY(),scale:t.applyZoomScale(1),visible:0!==a.length,name:"label"});c.add(o),c.add(new(an().Tag)({fill:t.getLineColour(),opacity:t.getTagOpacity()}));const u=new(an().Group);return u.name(this.getGroupName()),u.add(c),u.add(r),u.visible(!0),u}getAnchors(e,t){const n=e.x(),i=e.y(),r=e.width(),o=e.height(),a=[];return a.push(yi(n,i,"topLeft",t)),a.push(yi(n+r,i,"topRight",t)),a.push(yi(n+r,i+o,"bottomRight",t)),a.push(yi(n,i+o,"bottomLeft",t)),a}update(e,t,n){const r=e.getParent();if(!(r instanceof an().Group))return;const o=r.getChildren((function(e){return"shape"===e.name()}))[0],a=r.getChildren((function(e){return"label"===e.name()}))[0],s=r.getChildren((function(e){return"topLeft"===e.id()}))[0],l=r.getChildren((function(e){return"topRight"===e.id()}))[0],c=r.getChildren((function(e){return"bottomRight"===e.id()}))[0],u=r.getChildren((function(e){return"bottomLeft"===e.id()}))[0];let d;switch(e.id()){case"topLeft":s.x(e.x()),s.y(e.y()),l.y(e.y()),u.x(e.x());break;case"topRight":l.x(e.x()),l.y(e.y()),s.y(e.y()),c.x(e.x());break;case"bottomRight":c.x(e.x()),c.y(e.y()),u.y(e.y()),l.x(e.x());break;case"bottomLeft":u.x(e.x()),u.y(e.y()),c.y(e.y()),s.x(e.x());break;default:i.error("Unhandled anchor id: "+e.id())}o.position(s.position());const S=l.x()-s.x(),h=u.y()-s.y();S&&h&&o.size({width:S,height:h});const g=new A(r.x()+s.x(),r.y()+s.y()),m=new A(r.x()+c.x(),r.y()+c.y()),p=new qi(g,m);const f={x:p.getBegin().getX()-r.x(),y:p.getEnd().getY()-r.y()};a.position(f),this.#Io(r,n)}updateQuantification(e,t){this.#Io(e,t)}#Io(e,t){const n=e.getChildren((function(e){return"shape"===e.name()}))[0],i=e.getChildren((function(e){return"label"===e.name()}))[0];if(!(i instanceof an().Label))return;const r=new A(e.x()+n.x(),e.y()+n.y()),o=new A(r.getX()+n.width(),r.getY()+n.height()),a=new qi(r,o),s=i.getText(),l=s.meta,c=a.quantify(t,E(l.textExpr));s.setText(q(l.textExpr,c)),l.quantification=c}#To(e){const t=e.getRound(),n=t.max.getX()-t.min.getX(),i=t.max.getY()-t.min.getY();return new(an().Rect)({x:t.min.getX(),y:t.min.getY(),width:n,height:i,fill:"grey",strokeWidth:0,strokeScaleEnabled:!1,opacity:.3,name:"shadow"})}},RoiFactory:Ti,RulerFactory:class{getGroupName(){return"ruler-group"}getNPoints(){return 2}getTimeout(){return 0}isFactoryGroup(e){return this.getGroupName()===e.name()}create(e,t,n){const i=new mi(e[0],e[1]),r=new(an().Line)({points:[i.getBegin().getX(),i.getBegin().getY(),i.getEnd().getX(),i.getEnd().getY()],stroke:t.getLineColour(),strokeWidth:t.getStrokeWidth(),strokeScaleEnabled:!1,name:"shape"}),o=t.scale(10),a=fi(i,e[0],o),s=new(an().Line)({points:[a.getBegin().getX(),a.getBegin().getY(),a.getEnd().getX(),a.getEnd().getY()],stroke:t.getLineColour(),strokeWidth:t.getStrokeWidth(),strokeScaleEnabled:!1,name:"shape-tick0"}),l=fi(i,e[1],o),c=new(an().Line)({points:[l.getBegin().getX(),l.getBegin().getY(),l.getEnd().getX(),l.getEnd().getY()],stroke:t.getLineColour(),strokeWidth:t.getStrokeWidth(),strokeScaleEnabled:!1,name:"shape-tick1"});r.hitFunc((function(e){e.beginPath(),e.moveTo(a.getBegin().getX(),a.getBegin().getY()),e.lineTo(a.getEnd().getX(),a.getEnd().getY()),e.lineTo(l.getEnd().getX(),l.getEnd().getY()),e.lineTo(l.getBegin().getX(),l.getBegin().getY()),e.closePath(),e.fillStrokeShape(r)}));const u=new(an().Text)({fontSize:t.getFontSize(),fontFamily:t.getFontFamily(),fill:t.getLineColour(),padding:t.getTextPadding(),shadowColor:t.getShadowLineColour(),shadowOffset:t.getShadowOffset(),name:"text"});let d="";const S=n.getModality();d=void 0!==Ii.labelText.ruler[S]?Ii.labelText.ruler[S]:Ii.labelText.ruler["*"];const h=i.quantify(n);u.setText(q(d,h)),u.meta={textExpr:d,quantification:h};const g=i.getBegin().getX()>i.getEnd().getX()?0:-1,m=i.getBegin().getY()>i.getEnd().getY()?-1:0,p=new(an().Label)({x:i.getEnd().getX()+g*u.width(),y:i.getEnd().getY()+m*t.applyZoomScale(15).y,scale:t.applyZoomScale(1),visible:0!==d.length,name:"label"});p.add(u),p.add(new(an().Tag)({fill:t.getLineColour(),opacity:t.getTagOpacity()}));const f=new(an().Group);return f.name(this.getGroupName()),f.add(p),f.add(s),f.add(c),f.add(r),f.visible(!0),f}getAnchors(e,t){const n=e.points(),i=[];return i.push(yi(n[0]+e.x(),n[1]+e.y(),"begin",t)),i.push(yi(n[2]+e.x(),n[3]+e.y(),"end",t)),i}update(e,t,n){const i=e.getParent(),r=i.getChildren((function(e){return"shape"===e.name()}))[0];if(!(r instanceof an().Line))return;const o=i.getChildren((function(e){return"shape-tick0"===e.name()}))[0];if(!(o instanceof an().Line))return;const a=i.getChildren((function(e){return"shape-tick1"===e.name()}))[0];if(!(a instanceof an().Line))return;const s=i.getChildren((function(e){return"label"===e.name()}))[0];if(!(s instanceof an().Label))return;const l=i.getChildren((function(e){return"begin"===e.id()}))[0],c=i.getChildren((function(e){return"end"===e.id()}))[0];switch(e.id()){case"begin":l.x(e.x()),l.y(e.y());break;case"end":c.x(e.x()),c.y(e.y())}const u=l.x()-r.x(),d=l.y()-r.y(),S=c.x()-r.x(),h=c.y()-r.y();r.points([u,d,S,h]);const g=new A(l.x(),l.y()),m=new A(c.x(),c.y()),p=new mi(g,m),f=new A(u,d),y=new A(S,h),D=fi(p,f,t.scale(10));o.points([D.getBegin().getX(),D.getBegin().getY(),D.getEnd().getX(),D.getEnd().getY()]);const C=fi(p,y,t.scale(10));a.points([C.getBegin().getX(),C.getBegin().getY(),C.getEnd().getX(),C.getEnd().getY()]),r.hitFunc((function(e){e.beginPath(),e.moveTo(D.getBegin().getX(),D.getBegin().getY()),e.lineTo(D.getEnd().getX(),D.getEnd().getY()),e.lineTo(C.getEnd().getX(),C.getEnd().getY()),e.lineTo(C.getBegin().getX(),C.getBegin().getY()),e.closePath(),e.fillStrokeShape(r)}));const v=s.getText(),I=v.meta,T=p.quantify(n);v.setText(q(I.textExpr,T)),I.quantification=T;const L=p.getBegin().getX()>p.getEnd().getX()?0:-1,P=p.getBegin().getY()>p.getEnd().getY()?-1:0,w={x:p.getEnd().getX()+L*v.width(),y:p.getEnd().getY()+P*t.applyZoomScale(15).y};s.position(w)}}},filter:{Threshold:class{#qi;constructor(e){this.#qi=e}#hr=new Ui;#Lo=!0;#Oe=new ke;activate(e){e&&(this.#Lo=!0)}init(){}run(e){this.#hr.setMin(e.min),this.#hr.setMax(e.max),this.#Lo&&(this.#hr.setOriginalImage(this.#qi.getLastImage()),this.#Lo=!1);const t=new Bi(this.#hr,this.#qi);t.onExecute=this.#Re,t.onUndo=this.#Re,t.execute(),this.#qi.addToUndoStack(t)}addEventListener(e,t){this.#Oe.add(e,t)}removeEventListener(e,t){this.#Oe.remove(e,t)}#Re=e=>{this.#Oe.fireEvent(e)}},Sobel:class{#qi;constructor(e){this.#qi=e}#Oe=new ke;activate(e){}init(){}run(e){const t=new Qi;t.setOriginalImage(this.#qi.getLastImage());const n=new Bi(t,this.#qi);n.onExecute=this.#Re,n.onUndo=this.#Re,n.execute(),this.#qi.addToUndoStack(n)}addEventListener(e,t){this.#Oe.add(e,t)}removeEventListener(e,t){this.#Oe.remove(e,t)}#Re=e=>{this.#Oe.fireEvent(e)}},Sharpen:class{#qi;constructor(e){this.#qi=e}#Oe=new ke;activate(e){}init(){}run(e){const t=new Mi;t.setOriginalImage(this.#qi.getLastImage());const n=new Bi(t,this.#qi);n.onExecute=this.#Re,n.onUndo=this.#Re,n.execute(),this.#qi.addToUndoStack(n)}addEventListener(e,t){this.#Oe.add(e,t)}removeEventListener(e,t){this.#Oe.remove(e,t)}#Re=e=>{this.#Oe.fireEvent(e)}}}};class ki{divId;orientation;colourMap;opacity;wlPresetName;windowCenter;windowWidth;constructor(e){this.divId=e}}class Hi{options;constructor(e){this.options=e}}class zi{dataViewConfigs;tools;binders;viewOnFirstLoadItem;defaultCharacterSet;overlayConfig;constructor(e){this.dataViewConfigs=e}}class Wi{#ai=null;#Po=null;#wo=null;#Oo=null;#Ao=null;#bo=null;#Ht=new sn;#xo={};#Oe=new ke;getImage(e){let t;return void 0!==this.#Po.get(e)&&(t=this.#Po.get(e).image),t}getLastImage(){const e=this.#Po.getDataIds(),t=e[e.length-1];return this.getImage(t)}setImage(e,t){this.#Po.setImage(e,t)}setLastImage(e){const t=this.#Po.getDataIds(),n=t[t.length-1];this.#Po.setImage(n,e)}addNewImage(e,t,n){const i=this.#Po.getNextDataId();return this.#Re({type:"loadstart",loadtype:"image",source:n,dataid:i}),this.#Po.addNew(i,e,t),this.#Re({type:"loaditem",loadtype:"image",data:t,source:n,dataid:i,isfirstitem:!0}),this.#ai.viewOnFirstLoadItem&&this.render(i),this.#Re({type:"load",loadtype:"image",source:n,dataid:i}),this.#Re({type:"loadend",loadtype:"image",source:n,dataid:i}),i}getMetaData(e){let t;return void 0!==this.#Po.get(e)&&(t=this.#Po.get(e).meta),t}getDataIds(){return this.#Po.getDataIds()}getDataIdsFromSopUids(e){return this.#Po.getDataIdsFromSopUids(e)}canScroll(){return this.#Ao.getActiveLayerGroup().getActiveViewLayer().getViewController().canScroll()}canWindowLevel(){return this.#Ao.getActiveLayerGroup().getActiveViewLayer().getViewController().canWindowLevel()}getAddedScale(){return this.#Ao.getActiveLayerGroup().getAddedScale()}getBaseScale(){return this.#Ao.getActiveLayerGroup().getBaseScale()}getOffset(){return this.#Ao.getActiveLayerGroup().getOffset()}getToolboxController(){return this.#wo}getActiveLayerGroup(){return this.#Ao.getActiveLayerGroup()}setActiveLayerGroup(e){this.#Ao.setActiveLayerGroup(e)}getViewLayersByDataId(e){return this.#Ao.getViewLayersByDataId(e)}getDrawLayersByDataId(e){return this.#Ao.getDrawLayersByDataId(e)}getLayerGroupByDivId(e){return this.#Ao.getLayerGroupByDivId(e)}getNumberOfLayerGroups(){return this.#Ao.getNumberOfLayerGroups()}getStyle(){return this.#Ht}addToUndoStack=e=>{null!==this.#bo&&this.#bo.add(e)};init(e){if(this.#ai=e,void 0===this.#ai.viewOnFirstLoadItem&&(this.#ai.viewOnFirstLoadItem=!0),void 0===this.#ai.dataViewConfigs&&(this.#ai.dataViewConfigs={}),this.#bo=new Mn,this.#bo.addEventListener("undoadd",this.#Re),this.#bo.addEventListener("undo",this.#Re),this.#bo.addEventListener("redo",this.#Re),void 0!==this.#ai.tools){const e={},t=Object.keys(this.#ai.tools);for(let n=0;n{const t=this.#Po.getNextDataId();0!==e.length?this.#Oo.loadFiles(e,t):i.warn("Ignoring empty input file list.")};loadURLs=(e,t)=>{const n=this.#Po.getNextDataId();0!==e.length?this.#Oo.loadURLs(e,n,t):i.warn("Ignoring empty input url list.")};loadFromUri=(e,t)=>{const n=function(e){const t=Un(e);return 0===Object.keys(t).length?null:t.query}(e),r=()=>{this.removeEventListener("loadend",r),this.loadURLs([n.state])};n&&void 0!==n.input&&(void 0!==n.state&&this.addEventListener("loadend",r),function(e,t,n){e.type&&"manifest"===e.type?function(e,t){let n="";"/"===e.input[0]&&(n=window.location.protocol+"//"+window.location.host),n+=e.input;const r=new XMLHttpRequest;r.open("GET",decodeURIComponent(n),!0),r.responseType="document",r.onload=function(n){t(function(e,t){const n=[],r=e.getElementsByTagName("wado_query")[0].getAttribute("wadoURL")+"?requestType=WADO&contentType=application/dicom&",o=e.getElementsByTagName("Patient");o.length>1&&i.warn("More than one patient, loading first one.");const a=o[0].getElementsByTagName("Study");a.length>1&&i.warn("More than one study, loading first one.");const s=a[0].getAttribute("StudyInstanceUID"),l=a[0].getElementsByTagName("Series");l.length>1&&i.warn("More than one series, loading first one.");const c=l[0].getAttribute("SeriesInstanceUID"),u=l[0].getElementsByTagName("Instance");let d=u.length;t{const t=this.#Po.getNextDataId();this.#Oo.loadImageObject(e,t)};abortAllLoads(){const e=this.#Oo.getLoadingDataIds();for(const t of e)this.abortLoad(t)}abortLoad(e){this.#Oo.abort(e),this.#Po.remove(e),this.#Ao.removeLayersByDataId(e)}fitToContainer(){this.#Ao.syncLayerGroupScale()}initWLDisplay(){this.#Ao.getActiveLayerGroup().getActiveViewLayer().getViewController().initialise()}setImageSmoothing(e){this.#Ao.setImageSmoothing(e),this.#Ao.draw()}getViewConfigs(e,t){if(null===this.#ai.dataViewConfigs||void 0===this.#ai.dataViewConfigs)throw new Error("No available data view configuration");let n=[];return void 0!==this.#ai.dataViewConfigs[e]?n=this.#ai.dataViewConfigs[e]:t||void 0===this.#ai.dataViewConfigs["*"]||(n=this.#ai.dataViewConfigs["*"]),n}getViewConfig(e,t,n){return this.getViewConfigs(e,n).find((function(e){return e.divId===t}))}getDataViewConfigs(){return this.#ai.dataViewConfigs}setDataViewConfigs(e){this.#Ao.empty(),this.#ai.dataViewConfigs=e,this.#Bo(e)}addDataViewConfig(e,t){const n=this.#ai.dataViewConfigs;if(void 0===n[e]&&(n[e]=[]),-1!==n[e].findIndex((function(e){return e.divId===t.divId})))throw new Error("Duplicate view config for data "+e+" and div "+t.divId);this.#ai.dataViewConfigs[e].push(t),void 0===this.#Ao.getLayerGroupByDivId(t.divId)&&this.#Vo(t),this.render(e,[t])}removeDataViewConfig(e,t){const n=this.#ai.dataViewConfigs;if(void 0===n[e])return;const i=n[e].findIndex((function(e){return e.divId===t}));if(-1!==i&&(n[e].splice(i,1),0===n[e].length&&delete n[e],void 0!==this.#Po.get(e))){const n=this.#Ao.getLayerGroupByDivId(t);if(void 0!==n){const t=n.getViewLayersByDataId(e);if(1!==t.length)throw new Error("Expected one view layer, got "+t.length);n.removeLayer(t[0]);const i=n.getDrawLayersByDataId(e);if(1!==i.length)throw new Error("Expected one draw layer, got "+i.length);n.removeLayer(i[0]),0===n.getNumberOfLayers()&&this.#Ao.removeLayerGroup(n)}}}updateDataViewConfig(e,t,n){const i=this.#ai.dataViewConfigs;if(void 0===i[e])throw new Error("No config for dataId: "+e);const r=i[e].findIndex((function(e){return e.divId===t}));if(-1===r)throw new Error("No config for dataId: "+e+" and divId: "+t);const o=i[e][r];for(const e in n)o[e]=n[e];const a=this.#Ao.getLayerGroupByDivId(o.divId);if(void 0!==a){const t=a.getViewLayersByDataId(e);if(1!==t.length)throw new Error("Expected one view layer, got "+t.length);a.removeLayer(t[0]);const n=a.getDrawLayersByDataId(e);if(1!==n.length)throw new Error("Expected one draw layer, got "+n.length);a.removeLayer(n[0])}this.render(e,[o])}#Bo(e){const t=Object.keys(e),n=[];for(let i=0;i{this.fitToContainer()};onKeydown=e=>{this.#Re(e)};defaultOnKeydown=e=>{if(e.ctrlKey)if(e.shiftKey){const t=this.#Ao.getActiveLayerGroup(),n=t.getActiveViewLayer().getViewController();"ArrowLeft"===e.key?n.moreThanOne(3)&&n.decrementIndex(3):"ArrowUp"===e.key?t.canScroll()&&n.incrementScrollIndex():"ArrowRight"===e.key?t.moreThanOne(3)&&n.incrementIndex(3):"ArrowDown"===e.key&&t.canScroll()&&n.decrementScrollIndex()}else if("y"===e.key)this.#bo.redo();else if("z"===e.key)this.#bo.undo();else if(" "===e.key)for(let e=0;e{this.#Oe.fireEvent(e)};#Ro=e=>{void 0!==this.#ai.overlayConfig&&(this.#xo[e.dataid]=new di(this,e.dataid,this.#ai.overlayConfig)),e.type="loadstart",this.#Re(e)};#Fo=e=>{e.type="loadprogress",this.#Re(e)};#Eo=e=>{void 0===e.data&&i.error("Missing loaditem event data."),void 0===e.loadtype&&i.error("Missing loaditem event load type.");const t=e.isfirstitem;let n=null;"image"===e.loadtype?(t?this.#Po.addNew(e.dataid,e.data.image,e.data.info):this.#Po.update(e.dataid,e.data.image,e.data.info),n=e.data.info):"state"===e.loadtype&&(this.applyJsonState(e.data),n="state"),this.#Re({type:"loaditem",data:n,source:e.source,loadtype:e.loadtype,dataid:e.dataid,isfirstitem:e.isfirstitem,warn:e.warn}),void 0!==this.#xo&&void 0!==this.#xo[e.dataid]&&this.#xo[e.dataid].addItemMeta(n),"image"===e.loadtype&&0!==this.getViewConfigs(e.dataid).length&&t&&this.#ai.viewOnFirstLoadItem&&this.render(e.dataid)};#qo=e=>{e.type="load",this.#Re(e)};#Uo=e=>{e.type="loadend",this.#Re(e)};#Mo=e=>{void 0===e.type&&(e.type="error"),this.#Re(e)};#Qo=e=>{void 0===e.type&&(e.type="abort"),this.#Re(e)};#No(e){e.addEventListener("zoomchange",this.#Re),e.addEventListener("offsetchange",this.#Re),e.addEventListener("renderstart",this.#Re),e.addEventListener("renderend",this.#Re);for(let t=0;t{const t=Tn(e.srclayerid).groupDivId,n=this.getViewConfig(e.dataid,t,!0);void 0!==n&&(n.windowCenter=void 0,n.windowWidth=void 0,n.wlPresetName=void 0,2===e.value.length&&(n.windowCenter=e.value[0],n.windowWidth=e.value[1]),3===e.value.length&&(n.wlPresetName=e.value[2]))})),e.addEventListener("opacitychange",(e=>{const t=Tn(e.srclayerid).groupDivId,n=this.getViewConfig(e.dataid,t,!0);void 0!==n&&(n.opacity=e.value[0])})),e.addEventListener("colourmapchange",(e=>{const t=Tn(e.srclayerid).groupDivId,n=this.getViewConfig(e.dataid,t,!0);void 0!==n&&(n.colourMap=e.value[0])}))}#Go(e,t){const n=this.#Po.get(e);if(!n)throw new Error("Cannot initialise layer with missing data, id: "+e);const i=this.#Ao.getLayerGroupByDivId(t.divId);if(!i)throw new Error("Cannot initialise layer with missing group, id: "+t.divId);const o=n.image.getGeometry();this.#Ao.unbindLayerGroups();const a=(new Wt).create(n.meta,n.image),s=function(e,t){let n=O();return void 0!==t&&(n=e.asOneAndZeros().getInverse().multiply(t)),n.getAbs()}(o.getOrientation(),function(e){let t;return e===ye.Axial?t=O():e===ye.Coronal?t=fe():e===ye.Sagittal&&(t=new w([0,0,-1,1,0,0,0,-1,0])),t}(t.orientation));a.setOrientation(s),"SEG"===n.image.getMeta().Modality&&a.setAlphaFunction((function(e){return 0===e[0]&&0===e[1]&&0===e[2]?0:255}));const l=0===i.getNumberOfLayers();let c=1;void 0!==t.opacity?c=t.opacity:l||(c=.5);const u=i.addViewLayer();u.setView(a,e);const d=o.getSize(s).get2D(),S=o.getSpacing(s).get2D();u.initialise(d,S,c);const h=u.getViewController();if(void 0!==t.wlPresetName)h.setWindowLevelPreset(t.wlPresetName);else if(void 0!==t.windowCenter&&void 0!==t.windowWidth){const e=new r(t.windowCenter,t.windowWidth);h.setWindowLevel(e)}let g;void 0!==t.colourMap?h.setColourMap(t.colourMap):l||("PT"===n.image.getMeta().Modality?h.setColourMap("hot"):h.setColourMap("rainbow")),this.#Po.addEventListener("imageset",u.onimageset),this.#Po.addEventListener("imagechange",(e=>{u.onimagechange(e),this.render(e.dataid)})),this.#wo&&this.#wo.hasTool("Draw")&&(g=i.addDrawLayer(),g.initialise(d,S,e),g.setPlaneHelper(u.getViewController().getPlaneHelper()));const m=[h.getCurrentIndex().getValues(),h.getCurrentPosition().getValues()];i.updateLayersToPositionChange({value:m,srclayerid:u.getId()}),this.#Ao.syncLayerGroupScale(),u.setOffset(i.getOffset());const p=this.#ko(o.getOrientation(),t.orientation);if(p.offset.x&&(u.addFlipOffsetX(),void 0!==g&&g.addFlipOffsetX()),p.offset.y&&(u.addFlipOffsetY(),void 0!==g&&g.addFlipOffsetY()),p.scale.x&&(u.flipScaleX(),void 0!==g&&g.flipScaleX()),p.scale.y&&(u.flipScaleY(),void 0!==g&&g.flipScaleY()),p.scale.z&&(u.flipScaleZ(),void 0!==g&&g.flipScaleZ()),l)u.setScale(i.getScale());else{const e=i.getBaseViewLayer();u.initScale(i.getScale(),e.getZoomOffset())}void 0!==g&&g.setScale(i.getScale()),this.#Ao.bindLayerGroups(),this.#wo&&this.#wo.bindLayerGroup(i,u),l&&this.#wo&&this.#wo.init()}#ko(e,t){const n=De(e.asOneAndZeros());if(void 0===n)throw new Error("Unsupported undefined orientation code");const r=void 0===t,o=!r&&t===ye.Axial,a=!r&&t===ye.Coronal,s=!r&&t===ye.Sagittal,l={x:!1,y:!1},c={x:!1,y:!1,z:!1};return"LPS"===n?(a||s)&&(c.z=!0,l.y=!0):"LAI"===n?r||o?l.y=!0:a?c.z=!0:s&&(c.z=!0,l.x=!0):"RPI"===n?r||o?l.x=!0:a?(c.z=!0,l.x=!0):s&&(c.z=!0):"RAS"===n?(l.x=!0,l.y=!0,(a||s)&&(c.z=!0)):"LSA"===n?(l.y=!0,r||a?c.z=!0:o?c.y=!0:s&&(l.x=!0,c.y=!0,c.z=!0)):"RSP"===n?r||a?(l.x=!0,l.y=!0,c.x=!0,c.z=!0):o?(l.x=!0,c.x=!0):s&&(l.y=!0,c.z=!0):"RIA"===n?(l.x=!0,r||a?c.x=!0:o?(l.y=!0,c.x=!0,c.y=!0):s&&(c.y=!0)):"PSL"===n?(c.z=!0,(r||s||a)&&(l.y=!0)):"PIR"===n?(c.z=!0,(o||a)&&(l.x=!0)):"ASR"===n?(l.x=!0,l.y=!0,(r||s||a)&&(c.z=!0)):"AIL"===n?r||s?(l.x=!0,c.z=!0):o?l.y=!0:a&&(c.z=!0):i.warn("Unsupported orientation code: "+n+", display could be incorrect"),{scale:c,offset:l}}}class Yi{#$r;#Ho;constructor(e){this.#$r=e;const t=e.getMeta();void 0===t.custom&&(t.custom={}),void 0===t.custom.segments&&(t.custom.segments=[]),this.#Ho=t.custom.segments}#zo(e){return this.#Ho.findIndex((function(t){return t.number===e}))}hasSegment(e){return-1!==this.#zo(e)}maskHasSegments(e){const t=[],n=[];for(let r=0;r