{"version":3,"sources":["hicomImageAnnotation.ts"],"names":["Hicom","UI","Engine","TagHelper","HicomImageAnnotation","AllAnnotations","CurrentAnnotationNumber","AnnotationCanvasCtrl","ImageCanvasCtrl","AnnotationContext","ImageContext","CurrentPathPoints","PreviousPathPoint","InflightPathPoint","IsDrawing","ImgSrc","CtrlOutterId","ClickDrawingFunc","DblClickDrawingFunc","MouseDownDrawingFunc","MouseMoveDrawingFunc","MouseUpDrawingFunc","MouseMoveMarkerTextFunc","TouchStartFunc","PolyButtonClickFunc","CurrentMarkerType","MarkerLineThickness","MarkerLineColour","MarkerFillColour","MarkerHighlightLineColour","MarkerHighlightFillColour","AnnotationMarkerColour","AnnotationTextColour","AnnotationsDisplayMode","ReadOnlyMode","ToolTipCtrl","CurrentToolTipText","ResxRemoveAnnotationTitle","ResxRemoveAnnotationContent","HighlightingToClear","AnnotationListLocation","InTouchMode","InPolyDrawing","ForceWidth","ForceHeight","CanvasImagePartialID","CanvasAnnotationPartialID","HiddenAnnoJsonHolder","constructor","outterCtrlId","markerLineThickness","markerLineColour","markerFillColour","markerHighlightLineColour","markerHighlightFillColour","annotationMarkerColour","annotationTextColour","annotationsDisplayMode","readOnlyMode","resxRemoveAnnotationTitle","resxRemoveAnnotationContent","annotationListLocation","markerType","forceHeight","forceWidth","canvasImagePartialID","canvasAnnotationPartialID","hiddenAnnoJsonHolder","this","DataModel","AllImageAnnotationsDM","Array","document","getElementById","rect","getBoundingClientRect","ImageWidth","width","ImageHeight","height","InitImgAnnoCanvas","canvasImgSrc","let","imgAnnClass","img","getContext","removeAllAnnotationsFromList","Image","onload","canvasHolderDiv","parentElement","ratioHeight","ratioWidth","style","setProperty","hdnImgAnnoJsonHoler","drawImage","value","length","JSON","parse","currentAnnotationNumber","i","Annotations","AnnotationNumber","resetImgAnnClass","addAllAnnotationsToList","src","btn","divImgButtonContainer","children","HTMLButtonElement","id","e","drawingTypeOnCtrl","getAttribute","clickedMarkerType","setMarkerType","setMarkerHandlers","addEventListener","event","display","setupCurriedMarkerHandlersOnceEvenInReadOnly","setReadonlyMarkerHandlers","setupCurriedMarkerHandlersOnce","AnnotationMarkerTypeEnum","Point","addSinglePoint","Poly","addMultipleJoinedPoints","closeMultiPointPath","Freehand","startFreeHandJoinedPoints","Arrow","startArrowPoint","Circle","startCirclePoint","moveFreeHandJoinedPoints","moveArrowJoinedPoints","moveCircleJoinedPoints","checkForAnnotationMarkerHit","endFreeHandJoinedPoints","endArrowPoint","endCirclePoint","touchModeON","removeEventListener","DOMException","classList","remove","add","arrowBtn","freehandBtn","circleBtn","polyBtn","lastChild","textContent","touchModeOFF","posInfo","getMousePosPointerEvent","drawSinglePoint","push","PositionDM","X","Y","annotationDialogue","setupKendoAnnotationDialog","annotationOkayFunction","drawAnnotationMarker","redrawAll","sender","close","destroy","$","data","open","drawLine","inPolyDrawingFunc","pop","getMousePosMouseEvent","lengthOfPoints","drawArrow","drawCricle","anyFound","annoToCheck","MarkerLocation","TopLeft","BottomRight","top","left","setAttribute","AnnotationShortDesc","show","drawAddHighlighting","setAnnotationLiActive","hide","removeActiveFromAnnotationList","highlight","beginPath","fillStyle","strokeStyle","lineWidth","arc","Math","PI","fill","stroke","startPoint","endPoint","moveTo","lineTo","firstPoint","lastPoint","radius","lineDistance","lineAngle","atan2","delta","x","cos","y","sin","closePath","annotationToAdd","annotationMarkPoint","save","annotationNumLength","toString","workingX","workingY","atTop","widthSetTo","AnnotationMarkerType","roundRect","font","fillText","restore","RectPositionDM","annotation","MarkedPositions","polyPath","Path2D","fhPath","canvas","evt","scaleX","clientX","clientY","xs","ys","sqrt","clearRect","item","firstOccured","Event","dispatchEvent","redrawNeeded","actionOK","actionCancel","shortText","longText","dialog","kendoDialog","visible","title","closable","modal","actions","text","action","primary","AnnotationsDisplayModeEnum","OutsideImageInListOnly","content","HoverShortTextAndInOutsideList","olAnnoLst","appendChild","createAnnotationListItem","addLastAnnotationToList","deleteSpanIcon","li","createElement","annotationText","editSpanIcon","className","AnnotationLongDesc","innerHTML","curriedMouseDownTouchStartHighlight","currentTarget","target","contains","getShortAndLongTextFromDialog","firstChild","updateHdnJsonAndSetDirty","cssClass","splice","findIndex","curriedMouseUpTouchEndHighlight","AnnotationDM","closestForm","stringify","closest","HicomForm","SetDirty","HicomDirtyForms","setDirtyStatus","shortAnnoTextBox","longAnnoTextBox","getPrintableHtmlForImgAnnotationCtrl","mainDivID","canvasImageId","canvasAnnotationId","callBackFunctionAfterOnLoadOfImage","canvasAnnotation","dataset","initalLoadComplete","toLowerCase","internalsForGettingPrintableHTML","redrawCompletedFunc","mainDiv","canvasImage","combineCanvas","ctx","toDataURL","clonedDiv","cloneNode","querySelector","canvasImg","divCol","removeChild","outerHTML","KendoUploaderDeferredLoadImageAnnotationTool","hdnRespInfoStreamId","hdnRespInfoUploadedDate","hdnRespInfoUploadedBy","hdnRespInfoFileName","hdnRespInfoFileValueObjectId","hdnimageAnnotationUserFileUploadStatus","response","successDM","InitDeferredImgAnno","HiddenImgAnnoDetailsID","ImageBase64Src","ImgAnnoCtrlID","FormFieldId","StreamId","Date","toJSON","UploadedBy","FileName","FileValueObjectId","Status","hiddenInput","deferredData","Id","RemoveAnnotationTitle","RemoveAnnotation","MarkerType","ForceImageHeight","ForceImageWidth","console","error","InitDeferredImgAnnoStreamID","GetBase64ImageByStreamIDUrl","reqVerificationToken","val","fetch","method","headers","RequestVerificationToken","then","json","base64String","catch","cloneAndReplaceImageAnnotationTool","imageAnnotationHolderID","newImgAnnoHolder","imgAnnoHolder","insertBefore","handleKendoUploadError","log","operation","removeImageAnnotationImageAndShowUploadTool","removeUrl","imgAnnoContainerID","uploadContainerID","uploadCtrlID","formFieldId","formJsonInstanceId","formPageId","resxConfirmRemovalOfImageTitle","resxConfirmRemovalOfImageContent","formData","FormData","append","body","ok","annotationTool","hdnAnnJsonHolder","clearAllFiles","uploadTool","center","AnnotationListLocationEnum","ImageUserUploadSuccessDM","Success","topLeft","bottomRight","annotationNumber","annotationShortDesc","annotationLongDesc","markedPositions","annotationMarkerType"],"mappings":";AAEA,IAAUA,OAAAA,IAAaC,GAAPC,EAAAF,EAAAE,SAAAF,EAAAE,OAAM,KAACD,KAAAC,EAAAD,GAAE,IAAC,CAAA,IAAAE,EAAAF,EAAAE,YAAAF,EAAAE,UAAS,UAKlBC,EAEFC,eACAC,wBACAC,qBACAC,gBACAC,kBACAC,aACAC,kBACAC,kBACAC,kBACAC,UACAC,OACAC,aACAC,iBACAC,oBACAC,qBACAC,qBACAC,mBACAC,wBACAC,eACAC,oBACAC,kBACAC,oBACAC,iBACAC,iBACAC,0BACAC,0BACAC,uBACAC,qBACAC,uBACAC,aACAC,YACAC,mBACAC,0BACAC,4BACAC,oBACAC,uBACAC,YACAC,cACAC,WACAC,YACAC,qBACAC,0BACAC,qBAwBPC,YACIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAsB,EACtBC,EAAqB,EACrBC,EACAC,EACAC,GAGAC,KAAK/D,eAAiB,IAAIF,EAAAkE,UAAUC,sBACpCF,KAAKzD,kBAAoB,IAAI4D,MAC7BH,KAAK1C,oBAAsBwB,EAC3BkB,KAAKzC,iBAAmBwB,EACxBiB,KAAKxC,iBAAmBwB,EACxBgB,KAAKvC,0BAA4BwB,EACjCe,KAAKtC,0BAA4BwB,EACjCc,KAAKrC,uBAAyBwB,EAC9Ba,KAAKpC,qBAAuBwB,EAC5BY,KAAKnC,uBAAyBwB,EAC9BW,KAAKlC,aAAewB,EACpBU,KAAK/B,0BAA4BsB,EACjCS,KAAK9B,4BAA8BsB,EACnCQ,KAAK5B,uBAAyBqB,EAC9BO,KAAKvB,qBAAuBoB,EAC5BG,KAAKtB,0BAA4BoB,EACjCE,KAAKrB,qBAAuBoB,EAE5BC,KAAK5D,gBAAqCgE,SAASC,eAAe,GAAGL,KAAKvB,qBAAuBI,CAAc,EAC/GmB,KAAK7D,qBAA0CiE,SAASC,eAAe,GAAGL,KAAKtB,0BAA4BG,CAAc,EACzHmB,KAAKjC,YAA2BqC,SAASC,eAAe,YAAYxB,CAAc,EAClFmB,KAAKpD,aAAeiC,EAEhByB,EAAgBN,KAAK7D,qBAAqBoE,sBAAqB,EAEnEP,KAAK/D,eAAeuE,WAAaF,EAAKG,MACtCT,KAAK/D,eAAeyE,YAAcJ,EAAKK,OAEvCX,KAAK9D,wBAA0B,EAC/B8D,KAAKhC,mBAAqB,GAC1BgC,KAAK7B,oBAAsB,CAAA,EAC3B6B,KAAK3B,YAAc,CAAA,EACnB2B,KAAK1B,cAAgB,CAAA,EACrB0B,KAAK3C,kBAAoB,CAACqC,EAC1BM,KAAKzB,WAAaqB,EAClBI,KAAKxB,YAAcmB,CACvB,CAMOiB,kBACHC,GACAC,IAAIC,EAAoCf,KAOpCgB,GANJD,EAAY1E,kBAAoB2D,KAAK7D,qBAAqB8E,WAAW,IAAI,EACzEF,EAAYzE,aAAe0D,KAAK5D,gBAAgB6E,WAAW,IAAI,EAG/DF,EAAYG,6BAA6BH,CAAW,EAE1C,IAAII,OACdH,EAAII,OAAS,WAETN,IAAIO,EAAkDN,EAAY5E,qBAAqBmF,cACvFR,IAAIS,EACAC,EAE2B,GAA3BT,EAAYvC,aAA8C,GAA1BuC,EAAYxC,aAAiC,IAAbyC,EAAIL,QAA6B,IAAZK,EAAIP,OAErFO,EAAIL,OAASK,EAAIP,OAEjBe,EAAc,IAAOR,EAAIL,OAAUK,EAAIP,MACvCc,EAAc,MAGdA,EAAe,IAAOP,EAAIP,MAASO,EAAIL,OACvCa,EAAa,MAIjBA,EAAaR,EAAIP,MACjBc,EAAcP,EAAIL,QAIQ,EAA1BI,EAAYvC,aACZuC,EAAY5E,qBAAqBwE,OAASI,EAAYvC,YACtDuC,EAAY3E,gBAAgBuE,OAASI,EAAYvC,YACjD6C,EAAgBI,MAAMd,OAAYI,EAAYvC,YAAf,KAC/B6C,EAAgBI,MAAMC,YAAY,iBAAqBV,EAAIP,MAAP,IAAgB,IAEpEM,EAAY5E,qBAAqBwE,OAASY,EAC1CR,EAAY3E,gBAAgBuE,OAASY,EACrCF,EAAgBI,MAAMd,OAAYY,EAAH,KAC/BF,EAAgBI,MAAMC,YAAY,iBAAqBH,EAAH,IAAkB,GAG7C,EAAzBR,EAAYxC,YACZwC,EAAY5E,qBAAqBsE,MAAQM,EAAYxC,WACrDwC,EAAY3E,gBAAgBqE,MAAQM,EAAYxC,WAChD8C,EAAgBI,MAAMhB,MAAWM,EAAYxC,WAAf,KAC9B8C,EAAgBI,MAAMC,YAAY,gBAAoBV,EAAIP,MAAP,IAAgB,IAI/De,EAAa,KACbT,EAAY5E,qBAAqBsE,MAAQ,IACzCY,EAAgBI,MAAMhB,MAAQ,QAC9BY,EAAgBI,MAAMC,YAAY,gBAAiB,OAAO,IAG1DX,EAAY5E,qBAAqBsE,MAAQe,EACzCH,EAAgBI,MAAMhB,MAAWe,EAAH,KAC9BH,EAAgBI,MAAMC,YAAY,gBAAoBF,EAAH,IAAiB,GAGxET,EAAY3E,gBAAgBqE,MAAQe,GAGpCG,EAA0DvB,SAASC,eAAe,GAAGU,EAAYpC,qBAAuBoC,EAAYnE,YAAc,EAKtJ,GAHAmE,EAAYzE,aAAasF,UAAUZ,EAAK,EAAG,EAAGA,EAAIP,MAAOO,EAAIL,OACzD,EAAG,EAAGI,EAAY3E,gBAAgBqE,MAAOM,EAAY3E,gBAAgBuE,MAAM,EAExC,EAAnCgB,EAAoBE,MAAMC,OAAY,CAGtCf,EAAY9E,eAAiB8F,KAAKC,MAAML,EAAoBE,KAAK,EAEjEf,IAAImB,EAAkC,EAEtC,IAAK,IAAIC,EAAI,EAAGA,EAAInB,EAAY9E,eAAekG,YAAYL,OAAQI,CAAC,GAC5DnB,EAAY9E,eAAekG,YAAYD,GAAGE,iBAAmBH,IAC7DA,EAA0BlB,EAAY9E,eAAekG,YAAYD,GAAGE,kBAI5ErB,EAAY7E,wBAA0B+F,EAEtClB,EAAYsB,iBAAiBtB,EAAa,CAAA,CAAI,EAE9CA,EAAYuB,wBAAwBvB,CAAW,CACnD,CACJ,EAEAC,EAAIuB,IAAM1B,EACVb,KAAKrD,OAASkE,EAKd,IAFAC,IAiDY0B,EAjDRC,EAAwDrC,SAASC,eAAe,4BAA4BU,EAAYnE,YAAc,EAEjIsF,EAAI,EAAGA,EAAIO,EAAsBC,SAASZ,OAAQI,CAAC,GACpDO,EAAsBC,SAASR,aAAcS,oBACzCF,EAAsBC,SAASR,GAAGU,IAAM,qBAAqB7B,EAAYnE,cACzEmE,EAAY3D,oBAAsB,SAAUyF,GACxC/B,IAEIgC,EAF4C9C,KAEZ+C,aAAa,kBAAkB,EAS/DC,GALAjC,EAAYrE,WACZqE,EAAYsB,iBAAiBtB,EAAa,CAAA,CAAI,EAIlB,CAAC+B,GACjC/B,EAAY1D,kBAAoB2F,EAEhCjC,EAAYkC,cAdoCjD,IAcnB,EAE7Be,EAAYmC,kBAAkBnC,CAAW,CAC7C,EAGA0B,EAAsBC,SAASR,GAAGiB,iBAAiB,QAASpC,EAAY3D,mBAAmB,GAG3FqF,EAAsBC,SAASR,GAAGiB,iBAAiB,QAAS,SAAUC,GAClEtC,IAEIgC,EAF4C9C,KAEZ+C,aAAa,kBAAkB,EAQ/DC,GALAjC,EAAYrE,WACZqE,EAAYsB,iBAAiBtB,EAAa,CAAA,CAAI,EAIlB,CAAC+B,GACjC/B,EAAY1D,kBAAoB2F,EAEhCjC,EAAYkC,cAboCjD,IAanB,EAE7Be,EAAYmC,kBAAkBnC,CAAW,CAC7C,CAAC,EAOD,EAJAyB,EAA4CC,EAAsBC,SAASR,IAE3Ca,aAAa,kBAAkB,GAEzChC,EAAY1D,oBAClC0D,EAAYkC,cAAcT,CAAG,EAKrCzB,EAAYjD,cACiCsC,SAASC,eAAe,4BAA4BU,EAAYnE,YAAc,EACpH6E,MAAM4B,QAAU,OAEvBrD,KAAKsD,6CAA6CvC,CAAW,EAC7Df,KAAKuD,0BAA0BxC,CAAW,IAG1Cf,KAAKwD,+BAA+BzC,CAAW,EAG/Cf,KAAKkD,kBAAkBnC,CAAW,EAE1C,CAMQyC,+BAA+BzC,GAEnCA,EAAYlE,iBAAmB,SAAUuG,GACjCrC,EAAY1D,mBAAqBoG,EAAyBC,MAC1D3C,EAAY4C,eAAeP,EAAOrC,CAAW,EAExCA,EAAY1D,mBAAqBoG,EAAyBG,MAC/D7C,EAAY8C,wBAAwBT,EAAOrC,CAAW,CAE9D,EAEAA,EAAYjE,oBAAsB,SAAUsG,GACpCrC,EAAY1D,mBAAqBoG,EAAyBG,MAC1D7C,EAAY+C,oBAAoBV,EAAOrC,CAAW,CAE1D,EAEAA,EAAYhE,qBAAuB,SAAUqG,GACrCrC,EAAY1D,mBAAqBoG,EAAyBM,SAC1DhD,EAAYiD,0BAA0BZ,EAAOrC,CAAW,EACjDA,EAAY1D,mBAAqBoG,EAAyBQ,MACjElD,EAAYmD,gBAAgBd,EAAOrC,CAAW,EACvCA,EAAY1D,mBAAqBoG,EAAyBU,QACjEpD,EAAYqD,iBAAiBhB,EAAOrC,CAAW,CAEvD,EAEAA,EAAY/D,qBAAuB,SAAUoG,GACrCrC,EAAYrE,UACRqE,EAAY1D,mBAAqBoG,EAAyBM,SAC1DhD,EAAYsD,yBAAyBjB,EAAOrC,CAAW,EAChDA,EAAY1D,mBAAqBoG,EAAyBQ,MACjElD,EAAYuD,sBAAsBlB,EAAOrC,CAAW,EAC7CA,EAAY1D,mBAAqBoG,EAAyBU,QACjEpD,EAAYwD,uBAAuBnB,EAAOrC,CAAW,EAIzDA,EAAYyD,4BAA4BzD,EAAaqC,CAAK,CAElE,EAEArC,EAAY9D,mBAAqB,SAAUmG,GACnCrC,EAAY1D,mBAAqBoG,EAAyBM,SAC1DhD,EAAY0D,wBAAwBrB,EAAOrC,CAAW,EAC/CA,EAAY1D,mBAAqBoG,EAAyBQ,MACjElD,EAAY2D,cAActB,EAAOrC,CAAW,EACrCA,EAAY1D,mBAAqBoG,EAAyBU,QACjEpD,EAAY4D,eAAevB,EAAOrC,CAAW,CAErD,EAEAA,EAAY5D,eAAiB,SAAUiG,GACnCrC,EAAY6D,YAAY7D,CAAW,CACvC,EAEAA,EAAYuC,6CAA6CvC,CAAW,CACxE,CAMQuC,6CAA6CvC,GACjDA,EAAY7D,wBAA0B,SAAUkG,GACf,GAAzBrC,EAAYrE,WACZqE,EAAYyD,4BAA4BzD,EAAaqC,CAAK,CAElE,CACJ,CAMQF,kBAAkBnC,GAWtB,OATAA,EAAY5E,qBAAqB0I,oBAAoB,QAAS9D,EAAYlE,gBAAgB,EAC1FkE,EAAY5E,qBAAqB0I,oBAAoB,WAAY9D,EAAYjE,mBAAmB,EAChGiE,EAAY5E,qBAAqB0I,oBAAoB,YAAa9D,EAAYhE,oBAAoB,EAClGgE,EAAY5E,qBAAqB0I,oBAAoB,YAAa9D,EAAY/D,oBAAoB,EAClG+D,EAAY5E,qBAAqB0I,oBAAoB,UAAW9D,EAAY9D,kBAAkB,EAC9F8D,EAAY5E,qBAAqB0I,oBAAoB,YAAa9D,EAAY7D,uBAAuB,EACrG6D,EAAY5E,qBAAqB0I,oBAAoB,aAAc9D,EAAY5D,cAAc,EAGrF4D,EAAY1D,mBAChB,KAAKoG,EAAyBC,MAC1B3C,EAAY5E,qBAAqBgH,iBAAiB,QAASpC,EAAYlE,gBAAgB,EACvF,MACJ,KAAK4G,EAAyBQ,MAC1BlD,EAAY5E,qBAAqBgH,iBAAiB,YAAapC,EAAYhE,oBAAoB,EAC/FgE,EAAY5E,qBAAqBgH,iBAAiB,YAAapC,EAAY/D,oBAAoB,EAC/F+D,EAAY5E,qBAAqBgH,iBAAiB,UAAWpC,EAAY9D,kBAAkB,EAE3F,MACJ,KAAKwG,EAAyBG,KAC1B7C,EAAY5E,qBAAqBgH,iBAAiB,QAASpC,EAAYlE,gBAAgB,EACvFkE,EAAY5E,qBAAqBgH,iBAAiB,WAAYpC,EAAYjE,mBAAmB,EAE7F,MACJ,KAAK2G,EAAyBM,SAM9B,KAAKN,EAAyBU,OAC1BpD,EAAY5E,qBAAqBgH,iBAAiB,YAAapC,EAAYhE,oBAAoB,EAC/FgE,EAAY5E,qBAAqBgH,iBAAiB,YAAapC,EAAY/D,oBAAoB,EAC/F+D,EAAY5E,qBAAqBgH,iBAAiB,UAAWpC,EAAY9D,kBAAkB,EAE3F,MACJ,QACI,MAAM,IAAI6H,aAAa,oCAAoC,CACnE,CAEA1E,SAAS+C,iBAAiB,aAAcpC,EAAY5D,cAAc,EAElE4D,EAAYwC,0BAA0BxC,CAAW,CACrD,CAMQwC,0BAA0BxC,GAE9BA,EAAY5E,qBAAqB0I,oBAAoB,YAAa9D,EAAY7D,uBAAuB,EAErG6D,EAAY5E,qBAAqBgH,iBAAiB,YAAapC,EAAY7D,uBAAuB,CACtG,CAMQ+F,cAAcT,GAClB1B,IAAI2B,EAAwDD,EAAIlB,cAEhE,GAAImB,EACA,IAAK,IAAIP,EAAI,EAAGA,EAAIO,EAAsBC,SAASZ,OAAQI,CAAC,GACxDO,EAAsBC,SAASR,GAAG6C,UAAUC,OAAO,QAAQ,EAInExC,EAAIuC,UAAUE,IAAI,QAAQ,CAC9B,CAMQL,YAAY7D,GAChB,IAKQmE,EACAC,EACAC,EAPuB,GAA3BrE,EAAY1C,cACZ0C,EAAY1C,YAAc,CAAA,EAE1B0C,EAAY5E,qBAAqB0I,oBAAoB,WAAY9D,EAAYjE,mBAAmB,EAE5FoI,EAAiD9E,SAASC,eAAe,sBAAsBU,EAAYnE,YAAc,EACzHuI,EAAoD/E,SAASC,eAAe,yBAAyBU,EAAYnE,YAAc,EAC/HwI,EAAkDhF,SAASC,eAAe,uBAAuBU,EAAYnE,YAAc,EAC3HyI,EAAgDjF,SAASC,eAAe,qBAAqBU,EAAYnE,YAAc,EAE3HsI,EAASzD,MAAM4B,QAAU,OACzB8B,EAAY1D,MAAM4B,QAAU,OAC5B+B,EAAU3D,MAAM4B,QAAU,OAE1BgC,EAAQC,UAAUC,YAAc,OAExC,CAMQC,aAAazE,GACjB,IAKQmE,EACAC,EACAC,EAPJrE,EAAY1C,cACZ0C,EAAY1C,YAAc,CAAA,EAE1B0C,EAAY5E,qBAAqB0I,oBAAoB,WAAY9D,EAAYjE,mBAAmB,EAE5FoI,EAAiD9E,SAASC,eAAe,sBAAsBU,EAAYnE,YAAc,EACzHuI,EAAoD/E,SAASC,eAAe,yBAAyBU,EAAYnE,YAAc,EAC/HwI,EAAkDhF,SAASC,eAAe,uBAAuBU,EAAYnE,YAAc,EAC3HyI,EAAgDjF,SAASC,eAAe,qBAAqBU,EAAYnE,YAAc,EAE3HsI,EAASzD,MAAM4B,QAAU,GACzB8B,EAAY1D,MAAM4B,QAAU,GAC5B+B,EAAU3D,MAAM4B,QAAU,GAE1BgC,EAAQC,UAAUC,YAAc,+BAExC,CAOQ5B,eAAeP,EAAqBrC,GACpC0E,EAAgC1E,EAAY2E,wBAAwB3E,EAAY5E,qBAAsBiH,CAAK,EAE/GrC,EAAY4E,gBAAgB5E,EAAa0E,CAAO,EAEhD1E,EAAYxE,kBAAkBqJ,KAAK,IAAI7J,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,CAAC,EAE7EC,EAAqBjF,EAAYkF,2BAA2B,SAAUpD,GAEtE9B,EAAY5E,qBAAqB0I,oBAAoB,QAAS9D,EAAYlE,gBAAgB,EAE1FkE,EAAYmF,uBAAuBnF,EAAa0C,EAAyBC,MAAOb,CAAC,EAEjF9B,EAAYoF,qBAAqBpF,EAAaA,EAAY9E,eAAekG,YAAYpB,EAAY9E,eAAekG,YAAYL,OAAS,GAAIf,EAAYxE,kBAAkB,EAAE,EAEzKwE,EAAYsB,iBAAiBtB,CAAW,EAExCA,EAAY5E,qBAAqBgH,iBAAiB,QAASpC,EAAYlE,gBAAgB,CAC3F,EAAG,SAAUgG,GACT9B,EAAYsB,iBAAiBtB,CAAW,EACxCA,EAAYqF,UAAUrF,CAAW,EACjC8B,EAAEwD,OAAOC,MAAK,EACdzD,EAAEwD,OAAOE,QAAO,CACpB,EAAGxF,CAAW,EAEdyF,EAAER,CAAkB,EAAES,KAAK,aAAa,EAAEC,KAAI,EAC9C3F,EAAYmC,kBAAkBnC,CAAW,CAC7C,CAOQ8C,wBACJT,EACArC,GAEI0E,EAAgC1E,EAAY2E,wBAAwB3E,EAAY5E,qBAAsBiH,CAAK,EAY/G,GAVApD,KAAK2F,gBAAgB5E,EAAa0E,CAAO,EAEzC1E,EAAYxE,kBAAkBqJ,KAAK,IAAI7J,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,CAAC,EAEtC,EAAvChF,EAAYxE,kBAAkBuF,QAG9Bf,EAAY4F,SAAS5F,EAAaA,EAAYxE,kBAAkBwE,EAAYxE,kBAAkBuF,OAAS,GAAIf,EAAYxE,kBAAkBwE,EAAYxE,kBAAkBuF,OAAS,EAAE,EAGlLf,EAAY1C,YAAa,CACzByC,IAAIuE,EAAgDjF,SAASC,eAAe,qBAAqBU,EAAYnE,YAAc,EAQ3H,GANImE,EAAYxE,kBAAkBuF,OAAS,EACvCuD,EAAQC,UAAUC,YAAc,iDAEhCF,EAAQC,UAAUC,YAAc,gBAGH,GAA7BxE,EAAYzC,cAAwB,CACpCyC,EAAYzC,cAAgB,CAAA,EAE5B+G,EAAQR,oBAAoB,QAAS9D,EAAY3D,mBAAmB,EAEpE0D,IAAI8F,EAAoB,SAAU/D,GAC1B9B,EAAYxE,kBAAkBuF,OAAS,EACvCf,EAAYsB,iBAAiBtB,EAAa,CAAA,CAAI,EAM9CA,EAAY+C,oBAAoBjB,EAAG9B,CAAW,EAE9CsE,EAAQlC,iBAAiB,QAASpC,EAAY3D,mBAAmB,EACjEiI,EAAQR,oBAAoB,QAAS+B,CAAiB,CAE9D,EAEAvB,EAAQlC,iBAAiB,QAASyD,CAAiB,CACvD,CACJ,CACJ,CAOQ9C,oBACJV,EACArC,GAEA,IAgBQiF,EAhBoC,GAAxCjF,EAAYxE,kBAAkBuF,SAEC,GAA3Bf,EAAY1C,YAEZ0C,EAAYxE,kBAAkBsK,IAAG,EAGjC9F,EAAY5E,qBAAqB0I,oBAAoB,QAAS9D,EAAYlE,gBAAgB,EAI9FkE,EAAY4F,SAAS5F,EAAaA,EAAYxE,kBAAkB,GAAIwE,EAAYxE,kBAAkBwE,EAAYxE,kBAAkBuF,OAAS,EAAE,EAG3If,EAAYxE,kBAAkBqJ,KAAK,IAAI7J,EAAAkE,UAAU4F,WAAW9E,EAAYxE,kBAAkB,GAAGuJ,EAAG/E,EAAYxE,kBAAkB,GAAGwJ,CAAC,CAAC,EAE/HC,EAAqBjF,EAAYkF,2BAA2B,SAAUpD,GAEtE9B,EAAYmF,uBAAuBnF,EAAa0C,EAAyBG,KAAMf,CAAC,EAEhF9B,EAAYoF,qBAAqBpF,EAAaA,EAAY9E,eAAekG,YAAYpB,EAAY9E,eAAekG,YAAYL,OAAS,GAAIf,EAAYxE,kBAAkB,EAAE,EAEzKwE,EAAYsB,iBAAiBtB,CAAW,EAEpCA,EAAY1C,cACZ0C,EAAY5E,qBAAqBgH,iBAAiB,QAASpC,EAAYlE,gBAAgB,EAEnCuD,SAASC,eAAe,qBAAqBU,EAAYnE,YAAc,EAEnH0I,UAAUC,YAAc,OAEhCxE,EAAYzC,cAAgB,CAAA,EAEpC,EAAG,SAAUuE,GACT9B,EAAYsB,iBAAiBtB,CAAW,EACxCA,EAAYqF,UAAUrF,CAAW,EACjC8B,EAAEwD,OAAOC,MAAK,EACdzD,EAAEwD,OAAOE,QAAO,CACpB,EAAGxF,CAAW,EAEdyF,EAAER,CAAkB,EAAES,KAAK,aAAa,EAAEC,KAAI,EAC9C3F,EAAYmC,kBAAkBnC,CAAW,EAEjD,CAOQiD,0BACJZ,EACArC,GAEI0E,EAAgC1E,EAAY+F,sBAAsB/F,EAAY5E,qBAAsBiH,CAAK,EAE7GrC,EAAYxE,kBAAkBqJ,KAAK,IAAI7J,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,CAAC,EAEjFhF,EAAYrE,UAAY,CAAA,CAC5B,CAOQ2H,yBACJjB,EACArC,GAEAD,IAAI2E,EAAgC1E,EAAY+F,sBAAsB/F,EAAY5E,qBAAsBiH,CAAK,EAEzG2D,EAAyBhG,EAAYxE,kBAAkBuF,OAAS,EAEpEf,EAAY4F,SAAS5F,EAAa0E,EAAS1E,EAAYxE,kBAAkBwK,EAAe,EAExFhG,EAAYxE,kBAAkBqJ,KAAK,IAAI7J,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,CAAC,CACrF,CAOQtB,wBACJrB,EACArC,GAEA,IAIQiF,EAJoC,GAAxCjF,EAAYxE,kBAAkBuF,SAE9Bf,EAAY4F,SAAS5F,EAAaA,EAAYxE,kBAAkB,GAAIwE,EAAYxE,kBAAkBwE,EAAYxE,kBAAkBuF,OAAS,EAAE,EAEvIkE,EAAqBjF,EAAYkF,2BAA2B,SAAUpD,GACtE9B,EAAYmF,uBAAuBnF,EAAa0C,EAAyBM,SAAUlB,CAAC,EAIpF9B,EAAYsB,iBAAiBtB,EAAa,CAAA,CAAI,CAClD,EAAG,SAAU8B,GACT9B,EAAYsB,iBAAiBtB,CAAW,EACxCA,EAAYqF,UAAUrF,CAAW,EACjC8B,EAAEwD,OAAOC,MAAK,EACdzD,EAAEwD,OAAOE,QAAO,CACpB,EAAGxF,CAAW,EAEdyF,EAAER,CAAkB,EAAES,KAAK,aAAa,EAAEC,KAAI,EAC9C3F,EAAYmC,kBAAkBnC,CAAW,EAEjD,CAOQmD,gBACJd,EACArC,GAEI0E,EAAgC1E,EAAY+F,sBAAsB/F,EAAY5E,qBAAsBiH,CAAK,EAE7GrC,EAAYxE,kBAAkBqJ,KAAK,IAAI7J,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,CAAC,EAEjFhF,EAAYrE,UAAY,CAAA,CAC5B,CAOQ4H,sBACJlB,EACArC,GAEIA,EAAYrE,YACR+I,EAAgC1E,EAAY+F,sBAAsB/F,EAAY5E,qBAAsBiH,CAAK,EAE7GrC,EAAYtE,kBAAoB,IAAIV,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,EAEzEhF,EAAYvE,mBACZuE,EAAY4F,SAAS5F,EAAaA,EAAYvE,kBAAmBuE,EAAYtE,iBAAiB,EAGlGsE,EAAYvE,kBAAoB,IAAIT,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,EAErF,CAOQrB,cACJtB,EACArC,GAEI0E,EAAgC1E,EAAY+F,sBAAsB/F,EAAY5E,qBAAsBiH,CAAK,EAC7GrC,EAAYxE,kBAAkBqJ,KAAK,IAAI7J,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,CAAC,EAEjFhF,EAAYiG,UAAUjG,EAAaA,EAAYxE,kBAAkB,GAAIwE,EAAYxE,kBAAkBwE,EAAYxE,kBAAkBuF,OAAS,EAAE,EAExIkE,EAAqBjF,EAAYkF,2BAA2B,SAAUpD,GACtE9B,EAAYmF,uBAAuBnF,EAAa0C,EAAyBQ,MAAOpB,CAAC,EAIjF9B,EAAYsB,iBAAiBtB,EAAa,CAAA,CAAI,CAClD,EAAG,SAAU8B,GACT9B,EAAYsB,iBAAiBtB,CAAW,EACxCA,EAAYqF,UAAUrF,CAAW,EACjC8B,EAAEwD,OAAOC,MAAK,EACdzD,EAAEwD,OAAOE,QAAO,CACpB,EAAGxF,CAAW,EAEdyF,EAAER,CAAkB,EAAES,KAAK,aAAa,EAAEC,KAAI,EAC9C3F,EAAYmC,kBAAkBnC,CAAW,CAC7C,CAOQqD,iBACJhB,EACArC,GAEI0E,EAAgC1E,EAAY+F,sBAAsB/F,EAAY5E,qBAAsBiH,CAAK,EAE7GrC,EAAYxE,kBAAkBqJ,KAAK,IAAI7J,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,CAAC,EAEjFhF,EAAYrE,UAAY,CAAA,CAC5B,CAOQ6H,uBACJnB,EACArC,GAEIA,EAAYrE,YACR+I,EAAgC1E,EAAY+F,sBAAsB/F,EAAY5E,qBAAsBiH,CAAK,EAE7GrC,EAAYtE,kBAAoB,IAAIV,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,EAEzEhF,EAAYvE,mBACZuE,EAAY4F,SAAS5F,EAAaA,EAAYvE,kBAAmBuE,EAAYtE,iBAAiB,EAGlGsE,EAAYvE,kBAAoB,IAAIT,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,EAErF,CAOQpB,eACJvB,EACArC,GAEI0E,EAAgC1E,EAAY+F,sBAAsB/F,EAAY5E,qBAAsBiH,CAAK,EAC7GrC,EAAYxE,kBAAkBqJ,KAAK,IAAI7J,EAAAkE,UAAU4F,WAAWJ,EAAQK,EAAGL,EAAQM,CAAC,CAAC,EAEjFhF,EAAYkG,WAAWlG,EAAaA,EAAYxE,kBAAkB,GAAIwE,EAAYxE,kBAAkBwE,EAAYxE,kBAAkBuF,OAAS,EAAE,EACzIkE,EAAqBjF,EAAYkF,2BAA2B,SAAUpD,GACtE9B,EAAYmF,uBAAuBnF,EAAa0C,EAAyBU,OAAQtB,CAAC,EAIlF9B,EAAYsB,iBAAiBtB,EAAa,CAAA,CAAI,CAClD,EAAG,SAAU8B,GACT9B,EAAYsB,iBAAiBtB,CAAW,EACxCA,EAAYqF,UAAUrF,CAAW,EACjC8B,EAAEwD,OAAOC,MAAK,EACdzD,EAAEwD,OAAOE,QAAO,CACpB,EAAGxF,CAAW,EAEdyF,EAAER,CAAkB,EAAES,KAAK,aAAa,EAAEC,KAAI,EAC9C3F,EAAYmC,kBAAkBnC,CAAW,CAC7C,CAOQyD,4BAA4BzD,EAAmC8B,GAEnE/B,IAAI2E,EAAgC1E,EAAY+F,sBAAsB/F,EAAY5E,qBAAsB0G,CAAC,EAEzG/B,IAAIoG,EAAoB,CAAA,EAExB,IAAK,IAAIhF,EAAI,EAAGA,EAAInB,EAAY9E,eAAekG,YAAYL,OAAQI,CAAC,GAAI,CACpEpB,IAAIqG,EAAsCpG,EAAY9E,eAAekG,YAAYD,GAE7EiF,EAAYC,gBACP3B,EAAQK,EAAIqB,EAAYC,eAAeC,QAAQvB,GAAKL,EAAQK,EAAIqB,EAAYC,eAAeE,YAAYxB,GAAOL,EAAQM,EAAIoB,EAAYC,eAAeC,QAAQtB,GAAKN,EAAQM,EAAIoB,EAAYC,eAAeE,YAAYvB,IAEtNhF,EAAYhD,YAAY0D,MAAM8F,IAAS9B,EAAQM,EAAX,KACpChF,EAAYhD,YAAY0D,MAAM+F,KAAU/B,EAAQK,EAAX,KAErC/E,EAAYhD,YAAY0J,aAAa,kBAAmBN,EAAYO,mBAAmB,EAE1C,GAAzC3G,EAAY/C,mBAAmB8D,QAEc,EAAzCqF,EAAYO,oBAAoB5F,QAChC0E,EAAEzF,EAAYhD,WAAW,EAAE4J,KAAI,EAE/B5G,EAAY/C,mBAAqBmJ,EAAYO,qBAI7C3G,EAAY/C,mBAAqB,GAAGmJ,EAAY/E,iBAGpDrB,EAAY6G,oBAAoBT,EAAapG,CAAW,EACxDA,EAAY5C,oBAAsB,CAAA,EAGlC6B,KAAK6H,sBAAsB9G,EAAaoG,CAAW,GAE9CpG,EAAY/C,oBAAsBmJ,EAAYO,qBAAkE,GAA1CP,EAAYO,oBAAoB5F,QAAef,EAAY/C,oBAAsB,GAAGmJ,EAAY/E,kBAE9H,EAAzC+E,EAAYO,oBAAoB5F,QAChC0E,EAAEzF,EAAYhD,WAAW,EAAE4J,KAAI,EAGI,GAAnC5G,EAAY5C,sBACZ4C,EAAY5C,oBAAsB,CAAA,EAElC4C,EAAY6G,oBAAoBT,EAAapG,CAAW,EAGxDf,KAAK6H,sBAAsB9G,EAAaoG,CAAW,KAGlDpG,EAAY/C,oBAAsBmJ,EAAYO,qBAAkE,GAA1CP,EAAYO,oBAAoB5F,QAAef,EAAY/C,oBAAsB,GAAGmJ,EAAY/E,oBAE9H,EAAzC+E,EAAYO,oBAAoB5F,QAChC0E,EAAEzF,EAAYhD,WAAW,EAAE4J,KAAI,EAE/B5G,EAAY/C,mBAAqBmJ,EAAYO,qBAI7C3G,EAAY/C,mBAAqB,GAAGmJ,EAAY/E,iBAGpDrB,EAAY5C,oBAAsB,CAAA,EAElC4C,EAAY6G,oBAAoBT,EAAapG,CAAW,EAGxDf,KAAK6H,sBAAsB9G,EAAaoG,CAAW,GAGvDD,EAAW,CAAA,EAGvB,CAEgB,GAAZA,IACAV,EAAEzF,EAAYhD,WAAW,EAAE+J,KAAI,EAE3B/G,EAAY5C,uBACZ4C,EAAYqF,UAAUrF,CAAW,EACjCA,EAAY5C,oBAAsB,CAAA,EAClC4C,EAAYgH,+BAA+BhH,CAAW,EAGlE,CAYQ4E,gBAAgB5E,EAAmC0E,EAA+BuC,EAAqB,CAAA,GAC3GjH,EAAY1E,kBAAkB4L,UAAS,EAEnCD,GACAjH,EAAY1E,kBAAkB6L,UAAYnH,EAAYrD,0BACtDqD,EAAY1E,kBAAkB8L,YAAcpH,EAAYtD,4BAGxDsD,EAAY1E,kBAAkB6L,UAAYnH,EAAYvD,iBACtDuD,EAAY1E,kBAAkB8L,YAAcpH,EAAYxD,kBAG5DwD,EAAY1E,kBAAkB+L,UAAYrH,EAAYzD,oBACtDyD,EAAY1E,kBAAkBgM,IAAI5C,EAAQK,EAAGL,EAAQM,EAAG,EAAG,EAAG,EAAIuC,KAAKC,EAAE,EACzExH,EAAY1E,kBAAkBmM,KAAI,EAClCzH,EAAY1E,kBAAkBoM,OAAM,CACxC,CASQ9B,SAAS5F,EAAmC2H,EAAkCC,EAAgCX,EAAqB,CAAA,GACvIjH,EAAY1E,kBAAkB4L,UAAS,EACvClH,EAAY1E,kBAAkBuM,OAAOF,EAAW5C,EAAG4C,EAAW3C,CAAC,EAC/DhF,EAAY1E,kBAAkBwM,OAAOF,EAAS7C,EAAG6C,EAAS5C,CAAC,EAC3DhF,EAAY1E,kBAAkB+L,UAAYrH,EAAYzD,oBAGlDyD,EAAY1E,kBAAkB8L,YAD9BH,EAC4CjH,EAAYtD,0BAGZsD,EAAYxD,iBAG5DwD,EAAY1E,kBAAkBoM,OAAM,CACxC,CASQxB,WAAWlG,EAAmC+H,EAAkCC,EAAiCf,EAAqB,CAAA,GACtIgB,EAAiBjI,EAAYkI,aAAaH,EAAYC,CAAS,EAEnEhI,EAAY1E,kBAAkB4L,UAAS,EACvClH,EAAY1E,kBAAkBgM,IAAIS,EAAWhD,EAAGgD,EAAW/C,EAAGiD,EAAQ,EAAG,EAAIV,KAAKC,GAAI,CAAA,CAAK,EAC3FxH,EAAY1E,kBAAkB+L,UAAYrH,EAAYzD,oBAElD0K,GACAjH,EAAY1E,kBAAkB6L,UAAYnH,EAAYrD,0BACtDqD,EAAY1E,kBAAkB8L,YAAcpH,EAAYtD,0BACxDsD,EAAY1E,kBAAkBmM,KAAI,IAGlCzH,EAAY1E,kBAAkB6L,UAAYnH,EAAYvD,iBACtDuD,EAAY1E,kBAAkB8L,YAAcpH,EAAYxD,kBAG5DwD,EAAY1E,kBAAkBoM,OAAM,CACxC,CASQzB,UAAUjG,EAAmC+H,EAAkCC,EAAiCf,EAAqB,CAAA,GACzIjH,EAAY1E,kBAAkB4L,UAAS,EACvClH,EAAY1E,kBAAkBuM,OAAOE,EAAWhD,EAAGgD,EAAW/C,CAAC,EAC/DhF,EAAY1E,kBAAkBwM,OAAOE,EAAUjD,EAAGiD,EAAUhD,CAAC,EAC7DhF,EAAY1E,kBAAkB+L,UAAYrH,EAAYzD,oBAGlDyD,EAAY1E,kBAAkB8L,YAD9BH,EAC4CjH,EAAYtD,0BAGZsD,EAAYxD,iBAM3C,CACbuD,IAAIoI,EAAoBZ,KAAKa,MAAML,EAAW/C,EAAIgD,EAAUhD,EAAG+C,EAAWhD,EAAIiD,EAAUjD,CAAC,EACzFhF,IAAIsI,EAAgBd,KAAKC,GAAK,EAC9B,IAAK,IAAIrG,EAAI,EAAGA,EAAI,EAAGA,CAAC,GAAI,CACxBnB,EAAY1E,kBAAkBuM,OAAOG,EAAUjD,EAAGiD,EAAUhD,CAAC,EAC7DjF,IAAIuI,EAAIN,EAAUjD,EAPJ,GAOkBwC,KAAKgB,IAAIJ,EAAYE,CAAK,EACtDG,EAAIR,EAAUhD,EARJ,GAQkBuC,KAAKkB,IAAIN,EAAYE,CAAK,EAC1DrI,EAAY1E,kBAAkBwM,OAAOQ,EAAGE,CAAC,EACzCxI,EAAY1E,kBAAkB+L,UAAYrH,EAAYzD,oBACtDyD,EAAY1E,kBAAkB8L,YAAcpH,EAAYxD,iBAGpDwD,EAAY1E,kBAAkB8L,YAD9BH,EAC4CjH,EAAYtD,0BAGZsD,EAAYxD,iBAG5D6L,GAAS,CAAC,CACd,CACJ,CACArI,EAAY1E,kBAAkBoM,OAAM,EACpC1H,EAAY1E,kBAAkBoN,UAAS,CAC3C,CAQQtD,qBAAqBpF,EAAmC2I,EAAyCC,GAGrG5I,EAAY1E,kBAAkBuN,KAAI,EAClC9I,IAAI+I,EAA8BH,EAAgBtH,iBAAiB0H,SAAQ,EAAGhI,OAE9EhB,IAAIiJ,EACAC,EAmBAC,EAAiB,CAAA,EASjBC,IAfAF,EAXAN,EAAgBS,sBAAwB1G,EAAyBU,QACtC,GAAvB0F,EACAE,EAAWJ,EAAoB7D,EAAI,GACL,GAAvB+D,EACPE,EAAWJ,EAAoB7D,EAAI,GACL,GAAvB+D,EACPE,EAAWJ,EAAoB7D,EAAI,GACL,GAAvB+D,IACPE,EAAWJ,EAAoB7D,EAAI,IAG5B6D,EAAoB5D,EAAI,KAEnCgE,EAAWJ,EAAoB7D,EAAI,GACxB6D,EAAoB5D,EAAI,MAMvB,IACZiE,EAAW,EACXC,EAAQ,CAAA,GAGZlJ,EAAY1E,kBAAkB4L,UAAS,EACd,GAEE,GAAvB4B,GAEIE,EAAYhJ,EAAY5E,qBAAqBsE,MAAQ,KACjDwJ,GAEAF,EAAWhJ,EAAY5E,qBAAqBsE,MAAQ,GACpDuJ,GAAsB,IAKtBD,EAAWhJ,EAAY5E,qBAAqBsE,MAAQ,IAI5DyJ,EAAa,GACbnJ,EAAY1E,kBAAkB+N,UAAUL,EAAUC,EAAUE,EAAY,GAAI,CAAC,EAAE,GAEjD,GAAvBL,GAEHE,EAAYhJ,EAAY5E,qBAAqBsE,MAAQ,KACjDwJ,GAEAF,EAAWhJ,EAAY5E,qBAAqBsE,MAAQ,GACpDuJ,GAAsB,IAKtBD,EAAWhJ,EAAY5E,qBAAqBsE,MAAQ,IAI5DyJ,EAAa,GACbnJ,EAAY1E,kBAAkB+N,UAAUL,EAAUC,EAAUE,EAAY,GAAI,CAAC,EAAE,GACjD,GAAvBL,GAGHE,EAAYhJ,EAAY5E,qBAAqBsE,MAAQ,KACjDwJ,GAEAF,EAAWhJ,EAAY5E,qBAAqBsE,MAAQ,GACpDuJ,GAAsB,IAKtBD,EAAWhJ,EAAY5E,qBAAqBsE,MAAQ,IAI5DyJ,EAAa,GACbnJ,EAAY1E,kBAAkB+N,UAAUL,EAAUC,EAAUE,EAAY,GAAI,CAAC,EAAE,GACjD,GAAvBL,IAEHE,EAAYhJ,EAAY5E,qBAAqBsE,MAAQ,KACjDwJ,GAEAF,EAAWhJ,EAAY5E,qBAAqBsE,MAAQ,GACpDuJ,GAAsB,IAKtBD,EAAWhJ,EAAY5E,qBAAqBsE,MAAQ,IAI5DyJ,EAAa,GACbnJ,EAAY1E,kBAAkB+N,UAAUL,EAAUC,EAAUE,EAAY,GAAI,CAAC,EAAE,GAGnFnJ,EAAY1E,kBAAkBoM,OAAM,EAEpC1H,EAAY1E,kBAAkB6L,UAAYnH,EAAYpD,uBACtDoD,EAAY1E,kBAAkBmM,KAAI,EAGlCzH,EAAY1E,kBAAkBgO,KAAO,8BACrCtJ,EAAY1E,kBAAkB6L,UAAYnH,EAAYnD,qBAEtDmD,EAAY1E,kBAAkBiO,SAASZ,EAAgBtH,iBAAiB0H,SAAQ,EAAIC,EAAW,EAAGC,EAAW,EAAE,EAG/GjJ,EAAY1E,kBAAkBkO,QAAO,EAGrCb,EAAgBtC,eAAiB,IAAIrL,EAAAkE,UAAUuK,eAAe,IAAIzO,EAAAkE,UAAU4F,WAAWkE,EAAUC,CAAQ,EAAG,IAAIjO,EAAAkE,UAAU4F,WAAWkE,EAAWG,EAAYF,EAAW,EAAE,CAAC,CAC9K,CAOQpC,oBAAoB6C,EAAoC1J,GAE5D,GAAI0J,EAAWN,sBAAwB1G,EAAyBC,MAC5D3C,EAAY4E,gBAAgB5E,EAAa0J,EAAWC,gBAAgB,GAAI,CAAA,CAAI,OACzE,GAAID,EAAWN,sBAAwB1G,EAAyBQ,MACnElD,EAAYiG,UAAUjG,EAAa0J,EAAWC,gBAAgB,GAAID,EAAWC,gBAAgBD,EAAWC,gBAAgB5I,OAAS,GAAI,CAAA,CAAI,OACtI,GAAI2I,EAAWN,sBAAwB1G,EAAyBG,KAAM,CACzE9C,IAAI6J,EAAmB,IAAIC,OAC3BD,EAAS/B,OAAO6B,EAAWC,gBAAgB,GAAG5E,EAAG2E,EAAWC,gBAAgB,GAAG3E,CAAC,EAEhF,IAAK,IAAI7D,EAAI,EAAGA,EAAIuI,EAAWC,gBAAgB5I,OAAQI,CAAC,GACpDyI,EAAS9B,OAAO4B,EAAWC,gBAAgBxI,GAAG4D,EAAG2E,EAAWC,gBAAgBxI,GAAG6D,CAAC,EAGpFhF,EAAY1E,kBAAkB6L,UAAYnH,EAAYrD,0BACtDqD,EAAY1E,kBAAkBmM,KAAKmC,CAAQ,CAE/C,MAAO,GAAIF,EAAWN,sBAAwB1G,EAAyBM,SAAU,CAC7EjD,IAAI+J,EAAiB,IAAID,OACzBC,EAAOjC,OAAO6B,EAAWC,gBAAgB,GAAG5E,EAAG2E,EAAWC,gBAAgB,GAAG3E,CAAC,EAE9E,IAAS7D,EAAI,EAAGA,EAAIuI,EAAWC,gBAAgB5I,OAAQI,CAAC,GACpD2I,EAAOhC,OAAO4B,EAAWC,gBAAgBxI,GAAG4D,EAAG2E,EAAWC,gBAAgBxI,GAAG6D,CAAC,EAGlFhF,EAAY1E,kBAAkB6L,UAAYnH,EAAYrD,0BACtDqD,EAAY1E,kBAAkBmM,KAAKqC,CAAM,CAE7C,KAAO,CAAA,GAAIJ,EAAWN,sBAAwB1G,EAAyBU,OAInE,MAAM,IAAIW,aAAa,8BAA8B,EAHrD/D,EAAYkG,WAAWlG,EAAa0J,EAAWC,gBAAgB,GAAID,EAAWC,gBAAgBD,EAAWC,gBAAgB5I,OAAS,GAAI,CAAA,CAAI,CAI9I,CACJ,CAUQ4D,wBAAwBoF,EAA2BC,GACvD,IAAIzK,EAAOwK,EAAOvK,sBAAqB,EACnCyK,EAASF,EAAOrK,MAAQH,EAAKG,MAKjC,OAAO,IAAI1E,EAAAkE,UAAU4F,YAAYkF,EAAIE,QAAU3K,EAAKkH,MAAQwD,GAASD,EAAIG,QAAU5K,EAAKiH,MAJ3EuD,EAAOnK,OAASL,EAAKK,OAImE,CACzG,CAQQmG,sBAAsBgE,EAA2BC,GACrD,IAAIzK,EAAOwK,EAAOvK,sBAAqB,EACnCyK,EAASF,EAAOrK,MAAQH,EAAKG,MAKjC,OAAO,IAAI1E,EAAAkE,UAAU4F,YAAYkF,EAAIE,QAAU3K,EAAKkH,MAAQwD,GAASD,EAAIG,QAAU5K,EAAKiH,MAJ3EuD,EAAOnK,OAASL,EAAKK,OAImE,CACzG,CAQQsI,aAAaP,EAAkCC,GACnD7H,IAAIqK,EAAa,EACbC,EAAa,EAEjBD,EAAKxC,EAAS7C,EAAI4C,EAAW5C,EAM7B,OALAqF,GAAUA,EAEVC,EAAKzC,EAAS5C,EAAI2C,EAAW3C,EAC7BqF,GAAUA,EAEH9C,KAAK+C,KAAKF,EAAKC,CAAE,CAC5B,CAMQhF,UAAUrF,GAGdA,EAAY1E,kBAAkBiP,UAAU,EAAG,EAAGvK,EAAY5E,qBAAqBsE,MAAOM,EAAY5E,qBAAqBwE,MAAM,EAE7HG,IAAIE,EAAM,IAAIG,MACdH,EAAII,OAAS,WAGT,IAAKN,IAAIyK,KAAQxK,EAAY9E,eAAekG,YACpCoJ,EAAKpB,uBAAyB1G,EAAyBC,QACvD3C,EAAY4E,gBAAgB5E,EAAawK,EAAKb,gBAAgB,EAAE,EAEhE3J,EAAYoF,qBAAqBpF,EAAawK,EAAMA,EAAKb,gBAAgB,EAAE,GAKnF,IAAK5J,IAAIyK,KAAQxK,EAAY9E,eAAekG,YACpCoJ,EAAKpB,uBAAyB1G,EAAyBQ,QACvDlD,EAAYiG,UAAUjG,EAAawK,EAAKb,gBAAgB,GAAIa,EAAKb,gBAAgBa,EAAKb,gBAAgB5I,OAAS,EAAE,EAEjHf,EAAYoF,qBAAqBpF,EAAawK,EAAMA,EAAKb,gBAAgBa,EAAKb,gBAAgB5I,OAAS,EAAE,GAKjH,IAAKhB,IAAIyK,KAAQxK,EAAY9E,eAAekG,YACxC,GAAIoJ,EAAKpB,uBAAyB1G,EAAyBG,KAAM,CAE7D9C,IAAI0K,EAAwB,CAAA,EAE5B,IAAK,IAAItJ,EAAI,EAAGA,EAAIqJ,EAAKb,gBAAgB5I,OAAQI,CAAC,GAC9CnB,EAAY4E,gBAAgB5E,EAAawK,EAAKb,gBAAgBxI,EAAE,EAE5DsJ,GACAzK,EAAY4F,SAAS5F,EAAawK,EAAKb,gBAAgBxI,EAAI,GAAIqJ,EAAKb,gBAAgBxI,EAAE,EAG1FsJ,EAAe,CAAA,EAGnBzK,EAAYoF,qBAAqBpF,EAAawK,EAAMA,EAAKb,gBAAgB,EAAE,CAC/E,CAIJ,IAAK5J,IAAIyK,KAAQxK,EAAY9E,eAAekG,YACxC,GAAIoJ,EAAKpB,uBAAyB1G,EAAyBM,SAAU,CAEjEjD,IAAI0K,EAAwB,CAAA,EAE5B,IAAStJ,EAAI,EAAGA,EAAIqJ,EAAKb,gBAAgB5I,OAAQI,CAAC,GAC1CsJ,GACAzK,EAAY4F,SAAS5F,EAAawK,EAAKb,gBAAgBxI,EAAI,GAAIqJ,EAAKb,gBAAgBxI,EAAE,EAG1FsJ,EAAe,CAAA,EAGnBzK,EAAY4F,SAAS5F,EAAawK,EAAKb,gBAAgB,GAAIa,EAAKb,gBAAgBa,EAAKb,gBAAgB5I,OAAS,EAAE,EAEhHf,EAAYoF,qBAAqBpF,EAAawK,EAAMA,EAAKb,gBAAgB,EAAE,CAC/E,CAIJ,IAAK5J,IAAIyK,KAAQxK,EAAY9E,eAAekG,YACpCoJ,EAAKpB,uBAAyB1G,EAAyBU,SACvDpD,EAAYkG,WAAWlG,EAAawK,EAAKb,gBAAgB,GAAIa,EAAKb,gBAAgBa,EAAKb,gBAAgB5I,OAAS,EAAE,EAElHf,EAAYoF,qBAAqBpF,EAAawK,EAAMA,EAAKb,gBAAgB,EAAE,GAKnF,IAAMtH,EAAQ,IAAIqI,MAAM,iBAAiB,EAGzC1K,EAAY5E,qBAAqBuP,cAActI,CAAK,EAEpDrC,EAAY5E,qBAAqBsL,aAAa,4BAA6B,MAAM,CACrF,EAEAzG,EAAIuB,IAAMxB,EAAYpE,MAC1B,CAOQ0F,iBAAiBtB,EACrB4K,EAAwB,CAAA,GACxB5K,EAAYxE,kBAAoB,IAAI4D,MACpCY,EAAYrE,UAAY,CAAA,EACxBqE,EAAYtE,kBAAoB,KAChCsE,EAAYvE,kBAAoB,KAE5BmP,GACA5K,EAAYqF,UAAUrF,CAAW,CAEzC,CAWQkF,2BAA2B2F,EAAoBC,EAAwB9K,EAAmC+K,EAAoB,GAAIC,EAAmB,IACrJC,EAASxF,wBAAwBzF,EAAYnE,sBAAsB,EAAEqP,YAAY,CACjFxL,MAAO,QACPyL,QAAS,CAAA,EACTC,MAAO,aACPC,SAAU,CAAA,EACVC,MAAO,CAAA,EACPC,QAAS,CACL,CAAEC,KAAM,SAAUC,OAAQX,CAAY,EACtC,CAAEU,KAAM,KAAME,QAAS,CAAA,EAAMD,OAAQZ,CAAQ,E,CAEpD,EAqBD,OAnBI7K,EAAYlD,wBAA0B6O,EAA2BC,uBAEjEnG,EAAEwF,CAAM,EAAEvF,KAAK,aAAa,EAAEmG;;gFAEkC7L,EAAYnE,0IAA0ImP;mBACnN,EAEEhL,EAAYlD,wBAA0B6O,EAA2BG,gCAEtErG,EAAEwF,CAAM,EAAEvF,KAAK,aAAa,EAAEmG;+EACiC7L,EAAYnE;gDAC3CmE,EAAYnE,kEAAkEkP;;;8EAGhD/K,EAAYnE;gFACVmE,EAAYnE,0IAA0ImP;mBACnN,EAGAC,CACX,CAQQ1J,wBAAwBvB,GAC5BD,IAESyK,EAFLuB,EAAgD1M,SAASC,eAAe,oBAAoBU,EAAYnE,YAAc,EAE1H,IAAS2O,KAAQxK,EAAY9E,eAAekG,YACxC2K,EAAUC,YAAY/M,KAAKgN,yBAAyBzB,EAAMxK,CAAW,CAAC,CAE9E,CAMQkM,wBAAwBlM,GACwBX,SAASC,eAAe,oBAAoBU,EAAYnE,YAAc,EAEhHmQ,YAAY/M,KAAKgN,yBAAyBjM,EAAY9E,eAAekG,YAAYpB,EAAY9E,eAAekG,YAAYL,OAAS,GAAIf,CAAW,CAAC,CAC/J,CAQQiM,yBAAyBvC,EAAoC1J,GACjED,IAOQoM,EAPJC,EAAmC/M,SAASgN,cAAc,IAAI,EAe9DC,GAb4B,GAA5BtM,EAAYjD,gBACRwP,EAAiDlN,SAASgN,cAAc,GAAG,GAClEG,UAAY,2BACzBD,EAAa7F,aAAa,OAAQ,GAAG,GAEjCyF,EAAmD9M,SAASgN,cAAc,GAAG,GAClEG,UAAY,+BAC3BL,EAAezF,aAAa,OAAQ,GAAG,EAEvC0F,EAAGJ,YAAYO,CAAY,EAC3BH,EAAGJ,YAAYG,CAAc,GAGoB9M,SAASgN,cAAc,KAAK,GACjFC,EAAeE,UAAY,kBACiB,GAAxC9C,EAAW+C,mBAAmB1L,OAC9BuL,EAAeI,UAAYJ,EAAeI,UAG1CJ,EAAeI,UAAYJ,EAAeI,WAAY,GAAGhD,EAAW+C,oBAGxEL,EAAGJ,YAAYM,CAAc,EAE7BvM,IAAI6K,EAAwB,CAAA,EAEc,SAAtC+B,EAAgD7K,GAEhD/B,IAAIqM,EAAmCtK,EAAE8K,cAEzC,IAwCQ3B,EAJJL,EApCkB9I,EAAE+K,OAAQ7I,UAAU8I,SAAS,WAAW,GACtD7H,EAAqBjF,EAAYkF,2BAA2B,SAAUpD,GAStE,IAPA/B,GAAI,CAAEgL,UAAAA,EAAWC,SAAAA,CAAQ,EAA+ChL,EAAY+M,8BAA8B/M,CAAW,EAKzH+L,GAHJrC,EAAW/C,oBAAsBoE,EACjCrB,EAAW+C,mBAAqBzB,EAEoB3L,SAASC,eAAe,oBAAoBU,EAAYnE,YAAc,GAEnHkQ,EAAUiB,YACbjB,EAAUiB,WAAW/I,OAAM,EAG/BjE,EAAYuB,wBAAwBvB,CAAW,EAG/C,IAAK,IAAImB,EAAI,EAAGA,EAAInB,EAAY9E,eAAekG,YAAYL,OAAQI,CAAC,GAChEnB,EAAY9E,eAAekG,YAAYD,GAAGE,iBAAmBF,EAAI,EACjEnB,EAAY7E,wBAA0BgG,EAAI,EAG9CnB,EAAYiN,yBAAyBjN,CAAW,EAChDA,EAAYsB,iBAAiBtB,EAAa,CAAA,CAAI,EAE9CoM,EAAGpI,UAAUC,OAAO,QAAQ,EAE5BnC,EAAEwD,OAAOC,MAAK,EACdzD,EAAEwD,OAAOE,QAAO,CACpB,EAAG,SAAU1D,GACTsK,EAAGpI,UAAUC,OAAO,QAAQ,EAC5BnC,EAAEwD,OAAOC,MAAK,EACdzD,EAAEwD,OAAOE,QAAO,CACpB,EAAGxF,EAAa0J,EAAW/C,oBAAqB+C,EAAW+C,kBAAkB,EAE7EhH,EAAER,CAAkB,EAAES,KAAK,aAAa,EAAEC,KAAI,EAC/B,CAAA,GAEQ7D,EAAE+K,OAAQ7I,UAAU8I,SAAS,aAAa,GAE7D7B,EAASxF,8BAA8BzF,EAAYnE,sBAAsB,EAAEqP,YAAY,CACvFxL,MAAO,QACPyL,QAAS,CAAA,EACTC,MAAOpL,EAAY9C,0BACnBmO,SAAU,CAAA,EACVC,MAAO,CAAA,EACPO,QAAS7L,EAAY7C,4BACrBoO,QAAS,CACL,CACIC,KAAM,SAAUC,OAAQ,SAAU3J,GAC9BsK,EAAGpI,UAAUC,OAAO,QAAQ,EAC5BnC,EAAEwD,OAAOC,MAAK,EACdzD,EAAEwD,OAAOE,QAAO,CACpB,C,EAEF,CAEEgG,KAAM,SAAU0B,SAAU,iBAAkBxB,QAAS,CAAA,EAAMD,OAAQ,SAAU3J,GACzE9B,EAAY9E,eAAekG,YAAY+L,OAAOnN,EAAY9E,eAAekG,YAAYgM,UAAU5C,GAAQA,EAAKnJ,mBAAqBqI,EAAWrI,gBAAgB,EAAG,CAAC,EAKhK,IAFAtB,IAAIgM,EAAgD1M,SAASC,eAAe,oBAAoBU,EAAYnE,YAAc,EAEnHkQ,EAAUiB,YACbjB,EAAUiB,WAAW/I,OAAM,EAG/BjE,EAAYuB,wBAAwBvB,CAAW,EAG/C,IAAK,IAAImB,EAAI,EAAGA,EAAInB,EAAY9E,eAAekG,YAAYL,OAAQI,CAAC,GAChEnB,EAAY9E,eAAekG,YAAYD,GAAGE,iBAAmBF,EAAI,EACjEnB,EAAY7E,wBAA0BgG,EAAI,EAG9CnB,EAAYiN,yBAAyBjN,CAAW,EAChDA,EAAYsB,iBAAiBtB,EAAa,CAAA,CAAI,EAE9CoM,EAAGpI,UAAUC,OAAO,QAAQ,EAC5BnC,EAAEwD,OAAOC,MAAK,EACdzD,EAAEwD,OAAOE,QAAO,CACpB,C,GAGX,EAEDC,EAAEwF,CAAM,EAAEvF,KAAK,aAAa,EAAEC,KAAI,EACnB,CAAA,IAGf3F,EAAY6G,oBAAoB6C,EAAY1J,CAAW,EACxC,CAAA,GAGnBoM,EAAGpI,UAAUE,IAAI,QAAQ,CAC7B,CAEsC,SAAlCmJ,EAA4CvL,GACxC8I,GACA5K,EAAYqF,UAAUrF,CAAW,EAGE8B,EAAE8K,cACtC5I,UAAUC,OAAO,QAAQ,CAChC,CAiBA,OAfIjE,EAAY1C,aACZ8O,EAAGtI,oBAAoB,aAAc6I,CAAmC,EACxEP,EAAGtI,oBAAoB,WAAYuJ,CAA+B,EAElEjB,EAAGhK,iBAAiB,aAAcuK,CAAmC,EACrEP,EAAGhK,iBAAiB,WAAYiL,CAA+B,IAG/DjB,EAAGtI,oBAAoB,YAAa6I,CAAmC,EACvEP,EAAGtI,oBAAoB,UAAWuJ,CAA+B,EAEjEjB,EAAGhK,iBAAiB,YAAauK,CAAmC,EACpEP,EAAGhK,iBAAiB,UAAWiL,CAA+B,GAG3DjB,CACX,CAOQtF,sBAAsB9G,EAAmCoG,GAC7DrG,IAESyK,EAFLuB,EAAgD1M,SAASC,eAAe,oBAAoBU,EAAYnE,YAAc,EAE1H,IAAS2O,KAAQxK,EAAY9E,eAAekG,YACxC,IAAK,IAAID,EAAI,EAAGA,EAAI4K,EAAUpK,SAASZ,OAAQI,CAAC,GACxCiF,EAAY/E,kBAAqBF,EAAI,GACrC4K,EAAUpK,SAASR,GAAG6C,UAAUE,IAAI,QAAQ,CAI5D,CAMQ8C,+BAA+BhH,GAGnC,IAFAD,IAAIgM,EAAgD1M,SAASC,eAAe,oBAAoBU,EAAYnE,YAAc,EAEjHsF,EAAI,EAAGA,EAAI4K,EAAUpK,SAASZ,OAAQI,CAAC,GAC5C4K,EAAUpK,SAASR,GAAG6C,UAAUC,OAAO,QAAQ,CAEvD,CAMQ9D,6BAA6BH,GAGjC,IAFAD,IAAIgM,EAAgD1M,SAASC,eAAe,oBAAoBU,EAAYnE,YAAc,EAEjHsF,EAAI,EAAGA,EAAI4K,EAAUpK,SAASZ,OAAQI,CAAC,GAC5C4K,EAAUpK,SAASR,GAAG8C,OAAM,CAEpC,CAQQkB,uBAAuBnF,EAAmCrB,EAAsCmD,GACpG9B,EAAY7E,uBAAuB,GAEnC4E,GAAI,CAAEgL,UAAAA,EAAWC,SAAAA,CAAQ,EAA+ChL,EAAY+M,8BAA8B/M,CAAW,EAE7HA,EAAY9E,eAAekG,YAAYyD,KACnC,IAAI7J,EAAAkE,UAAUoO,aACVtN,EAAY7E,wBACZ4P,EACAC,EACAhL,EAAYxE,kBACZmD,CAAU,CACb,EAGLqB,EAAYkM,wBAAwBlM,CAAW,EAE/CA,EAAYiN,yBAAyBjN,CAAW,EAEhD8B,EAAEwD,OAAOC,MAAK,EACdzD,EAAEwD,OAAOE,QAAO,CACpB,CAMQyH,yBAAyBjN,GAC7BD,IAAIa,EAA0DvB,SAASC,eAAe,GAAGU,EAAYpC,qBAAuBoC,EAAYnE,YAAc,EAKlJ0R,GAFJ3M,EAAoBE,MAAQE,KAAKwM,UAAUxN,EAAY9E,cAAc,EAEnDuK,EAAEzF,EAAY5E,oBAAoB,EAAEqS,QAAQ,MAAM,EAAE,IAElEF,IAC+B,IAAIG,UAAUH,EAAY1L,EAAE,EAE7C8L,SAAQ,EAEtBC,gBAAgBC,eAAepI,EAAE7E,CAAmB,EAAGA,EAAoBE,KAAK,EAExF,CAOQiM,8BAA8B/M,GAClCD,IAAIgL,EAAoB,GAGpB/K,EAAYlD,wBAA0B6O,EAA2BG,iCAC7DgC,EAAuDzO,SAASC,eAAe,0BAA0BU,EAAYnE,YAAc,EACvIkP,EAAY+C,EAAiBhN,OAJjCf,IAOIgO,EAA4D1O,SAASC,eAAe,yBAAyBU,EAAYnE,YAAc,EAE3ImP,EAAW+C,EAAgBjN,MAC3B,MAAO,CAAEiK,UAAAA,EAAWC,SAAAA,CAAQ,CAChC,CAaOgD,4CAA4CC,EAAmBC,EAAuBC,EAAoBC,GAC7GrO,IAAIsO,EAAyDhP,SAASC,eAAe6O,CAAkB,EAEvG,GAAIE,EAAiBC,QAAQC,oBAAoF,SAA9DF,EAAiBC,QAAQC,mBAAmBC,YAAW,EACtGvT,EAAqBwT,iCAAiCR,EAAWC,EAAeC,EAAoBC,CAAkC,MAErI,CACDrO,IAAI2O,EAAsB,SAAU5M,GAChC7G,EAAqBwT,iCAAiCR,EAAWC,EAAeC,EAAoBC,CAAkC,EAEtIC,EAAiBvK,oBAAoB,kBAAmB4K,CAAmB,CAC/E,EAEAL,EAAiBjM,iBAAiB,kBAAmBsM,CAAmB,CAC5E,CACJ,CAQQD,wCAAwCR,EAAmBC,EAAuBC,EAAoBC,GAE1GrO,IAAI4O,EAA0CtP,SAASC,eAAe2O,CAAS,EAC3EW,EAAoDvP,SAASC,eAAe4O,CAAa,EACzFG,EAAyDhP,SAASC,eAAe6O,CAAkB,EAEnGU,EAAsDxP,SAASgN,cAAc,QAAQ,EAKrFyC,GAJJD,EAAchN,GAAK,gBACnBgN,EAAcjP,OAASyO,EAAiBzO,OACxCiP,EAAcnP,MAAQ2O,EAAiB3O,MAEuBmP,EAAc3O,WAAW,IAAI,GAQvFwF,GANJoJ,EAAIjO,UAAU+N,EAAa,EAAG,EAAGA,EAAYlP,MAAOkP,EAAYhP,OAC5D,EAAG,EAAGgP,EAAYlP,MAAOkP,EAAYhP,MAAM,EAE/CkP,EAAIjO,UAAUwN,EAAkB,EAAG,EAAGA,EAAiB3O,MAAO2O,EAAiBzO,OAC3E,EAAG,EAAGyO,EAAiB3O,MAAO2O,EAAiBzO,MAAM,EAEtCiP,EAAcE,UAAU,WAAW,GAEtDhP,IAAIiP,EAA4CL,EAAQM,UAAU,CAAA,CAAI,EAEtED,EAAUE,cAAc,QAAQ,EAAEjL,OAAM,EACxC+K,EAAUE,cAAc,sBAAsB,EAAEjL,OAAM,EACtD+K,EAAUE,cAAc,yBAAyB,EAAEjL,OAAM,EAErDkL,EAA8B,IAAI/O,MACtC+O,EAAU3N,IAAMkE,EAGZ0J,EAAyCJ,EAAUE,cAAc,QAAQ,EAAE3O,cAAcA,cAE7F6O,EAAOC,YAAYD,EAAOpC,UAAU,EAEpCoC,EAAOpD,YAAYmD,CAAS,EAE5BA,EAAU9O,OAAS,WACf,OAAO+N,EAAmCY,EAAUM,SAAS,CACjE,CACJ,CAMOC,oDAAoDzN,GACvD,IAaQ0N,EACAC,EACAC,EACAC,EACAC,EACAC,EAlBJ/N,EAAEgO,WACEC,EAAoFjO,EAAEgO,SAE1F7U,EAAqB+U,oBAAoBD,EAAUE,uBAAwBF,EAAUG,cAAc,EAEvC7Q,SAASC,eAAe,yBAAyByQ,EAAUI,aAAe,EAEhHzP,MAAM4B,QAAU,OAEuBjD,SAASC,eAAe,0BAA0ByQ,EAAUI,aAAe,EAEjHzP,MAAM4B,QAAU,QAEnCkN,EAA0DnQ,SAASC,eAAe,4CAA4CyQ,EAAUK,WAAa,EACrJX,EAA8DpQ,SAASC,eAAe,gDAAgDyQ,EAAUK,WAAa,EAC7JV,EAA4DrQ,SAASC,eAAe,8CAA8CyQ,EAAUK,WAAa,EACzJT,EAA0DtQ,SAASC,eAAe,4CAA4CyQ,EAAUK,WAAa,EACrJR,EAAmEvQ,SAASC,eAAe,qDAAqDyQ,EAAUK,WAAa,EACvKP,EAA6ExQ,SAASC,eAAe,0CAA0CyQ,EAAUK,WAAa,EAE1KZ,EAAoB1O,MAAQiP,EAAUM,SACtCZ,EAAwB3O,OAAQ,IAAIwP,MAAOC,OAAM,EACjDb,EAAsB5O,MAAQiP,EAAUS,WAAWzH,SAAQ,EAC3D4G,EAAoB7O,MAAQiP,EAAUU,SACtCb,EAA6B9O,MAAQiP,EAAUW,kBAC/Cb,EAAuC/O,MAAQiP,EAAUY,OAAO5H,SAAQ,EAEhF,CAOOiH,2BAA2BC,EAAgCC,GAC9DnQ,IAAI6Q,EAAkDvR,SAASC,eAAe2Q,CAAsB,EAE/FW,GAMDC,EAAe7P,KAAKC,MAAM2P,EAAY9P,KAAK,EAGjC,IAAI7F,EACd4V,EAAaC,GACbD,EAAatU,oBACbsU,EAAarU,iBACbqU,EAAapU,iBACboU,EAAanU,0BACbmU,EAAalU,0BACbkU,EAAajU,uBACbiU,EAAahU,qBACbgU,EAAa/T,uBACb+T,EAAa9T,aACb8T,EAAaE,sBACbF,EAAaG,iBACbH,EAAaxT,uBACbwT,EAAaI,WACbJ,EAAaK,iBACbL,EAAaM,gBACbN,EAAanT,qBACbmT,EAAalT,0BACbkT,EAAajT,oBAAoB,EAI7BiC,kBAAkBqQ,CAAc,GA/BpCkB,QAAQC,8BAA8BpB,cAAmC,CAgCjF,CAQOqB,mCAAmCrB,EAAgCsB,GACtExR,IAAIyR,EAA+B/L,EAAE,iDAAiD,EAAEgM,IAAG,EAAG1I,SAAQ,EAEtG2I,MAAMH,EAA6B,CAC/BI,OAAQ,MACRC,QAAS,CACLC,yBAA4BL,C,EAEnC,EACIM,KAAKhC,GAAYA,EAASiC,KAAI,CAAE,EAChCD,KAAKpM,IACF3F,IAAI6Q,EAAkDvR,SAASC,eAAe2Q,CAAsB,EAE/FW,GAMDC,EAAe7P,KAAKC,MAAM2P,EAAY9P,KAAK,EAGjC,IAAI7F,EACd4V,EAAaC,GACbD,EAAatU,oBACbsU,EAAarU,iBACbqU,EAAapU,iBACboU,EAAanU,0BACbmU,EAAalU,0BACbkU,EAAajU,uBACbiU,EAAahU,qBACbgU,EAAa/T,uBACb+T,EAAa9T,aACb8T,EAAaE,sBACbF,EAAaG,iBACbH,EAAaxT,uBACbwT,EAAaI,WACbJ,EAAaK,iBACbL,EAAaM,gBACbN,EAAanT,qBACbmT,EAAalT,0BACbkT,EAAajT,oBAAoB,EAI7BiC,kBAAkB6F,EAAKsM,YAAY,GA/BvCZ,QAAQC,8BAA8BpB,cAAmC,CAgCjF,CAAC,EACAgC,MAAMZ,GAASD,QAAQC,MAAM,wBAAyBA,CAAK,CAAC,CACrE,CAMOa,0CAA0CC,GAC7CpS,IAKQqS,EALJC,EAA0ChT,SAASC,eAAe6S,CAAuB,EAEzFE,IAGID,EAAmBC,EAAcpD,UAAU,CAAA,CAAI,EAGnDoD,EAAc9R,cAAc+R,aAAaF,EAAkBC,CAAa,EAGxEA,EAAc9R,cAAc8O,YAAYgD,CAAa,EAE7D,CAMOE,8BAA8BzQ,GAEjCsP,QAAQoB,IAAI,UAAY1Q,EAAE2Q,UAAY,GAAG,CAC7C,CAeOC,mDACHC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAnU,GAEAyG,EAAE,aAAa,EAAEyF,YAAY,CACzBG,SAAU,CAAA,EACVD,MAAO8H,EACPrH,QAASsH,EACT5H,QAAS,CAAC,CACNC,KAAM,SACNC,OAAQ,SAAU3J,GAEd/B,IAAIyR,EAA+B/L,EAAE,iDAAiD,EAAEgM,IAAG,EAAG1I,SAAQ,EAElGyG,EAA0DnQ,SAASC,eAAe,4CAA4CyT,CAAa,EAE3IK,EAAW,IAAIC,SACnBD,EAASE,OAAO,cAAeP,CAAW,EAC1CK,EAASE,OAAO,qBAAsBN,CAAkB,EACxDI,EAASE,OAAO,aAAcL,CAAU,EACxCG,EAASE,OAAO,WAAY9D,EAAoB1O,KAAK,EAErD4Q,MAAMiB,EAAW,CACbhB,OAAQ,OACRC,QAAS,CACLC,yBAA4BL,C,EAEhC+B,KAAMH,C,CACT,EACItB,KAAKhC,IAEF,IAgBYL,EACAC,EACAC,EACAC,EACAC,EApBRC,EAAS0D,IAGTvY,EAAqBiX,mCAAmCU,CAAkB,GAEpEa,EAAiBpU,SAASC,eAAesT,CAAkB,KAE7Da,EAAe/S,MAAM4B,QAAU,QAC3BoR,EAAuDrU,SAASC,eAAe,GAAGN,CAAsB,KAIxG0U,EAAiB5S,MAAQ,IAGzB0O,EAA0DnQ,SAASC,eAAe,4CAA4CyT,CAAa,EAC3ItD,EAA8DpQ,SAASC,eAAe,gDAAgDyT,CAAa,EACnJrD,EAA4DrQ,SAASC,eAAe,8CAA8CyT,CAAa,EAC/IpD,EAA0DtQ,SAASC,eAAe,4CAA4CyT,CAAa,EAC3InD,EAAmEvQ,SAASC,eAAe,qDAAqDyT,CAAa,EAC7JlD,EAA6ExQ,SAASC,eAAe,0CAA0CyT,CAAa,EAEhKvD,EAAoB1O,MAAQ,GAC5B2O,EAAwB3O,MAAQ,GAChC4O,EAAsB5O,MAAQ,GAC9B6O,EAAoB7O,MAAQ,GAC5B8O,EAA6B9O,MAAQ,GACrC+O,EAAuC/O,MAAQ,IAGjB2E,EAAE,IAAIqN,CAAc,EAAEpN,KAAK,aAAa,EAC/DiO,cAAa,GAElBC,EAAavU,SAASC,eAAeuT,CAAiB,KAExDe,EAAWlT,MAAM4B,QAAU,UAK/B8O,QAAQC,MAAM,wBAAwB,CAE9C,CAAC,EACAY,MAAMZ,IACHD,QAAQC,MAAM,SAAUA,CAAK,CACjC,CAAC,CACT,EAEAnE,SAAU,gB,EACX,CACC1B,KAAM,Q,GAEb,EAAE9F,KAAK,aAAa,EAAEC,KAAI,EAAGkO,OAAM,CACxC,C,CAriES7Y,EAAAC,qBAAoBA,EA8iEjC8E,IAAY2C,GAAAA,EAAAA,EAAA1H,EAAA0H,2BAAA1H,EAAA0H,yBAAwB,KAChCA,EAAA,MAAA,GAAA,QACAA,EAAAA,EAAA,MAAA,GAAA,QACAA,EAAAA,EAAA,KAAA,GAAA,OACAA,EAAAA,EAAA,SAAA,GAAA,WACAA,EAAAA,EAAA,OAAA,GAAA,SAOJ3C,IAAY4L,GAAAA,EAAAA,EAAA3Q,EAAA2Q,6BAAA3Q,EAAA2Q,2BAA0B,KAClCA,EAAA,uBAAA,GAAA,yBACAA,EAAAA,EAAA,+BAAA,GAAA,kCAOQmI,EAAA9Y,EAAA8Y,6BAAA9Y,EAAA8Y,2BAA0B,KAClCA,EAAA,KAAA,GAAA,OACAA,EAAAA,EAAA,IAAA,GAAA,MACAA,EAAAA,EAAA,MAAA,GAAA,QACAA,EAAAA,EAAA,OAAA,GAAA,QA5kE2B,CA8kElC,GA9kESjZ,MAAAA,OAAK,EAAA,GAglELA,KAA0BqE,GAAVlE,GAAHF,GAAPC,EAAAF,EAAAE,SAAAF,EAAAE,OAAM,KAACD,KAAAC,EAAAD,GAAE,KAACE,YAAAF,EAAAE,UAAS,KAACkE,YAAAlE,EAAAkE,UAAS,KAK5B6U,+BAKFC,QAKA/D,uBAKAC,eAKAC,cAKAC,YAKAC,SAKAI,SAKAD,WAKAE,kBAKAC,M,EAMEzR,EAAA4F,iBAIFC,EAKAC,EAOPnH,YAAYyK,EAAWE,GACnBvJ,KAAK8F,EAAIuD,EACTrJ,KAAK+F,EAAIwD,CACb,C,EAMStJ,EAAAuK,qBAITnD,QAKAC,YAOA1I,YAAYoW,EAAqBC,GAC7BjV,KAAKqH,QAAU2N,EACfhV,KAAKsH,YAAc2N,CACvB,C,EAMShV,EAAAC,4BAIFM,WAKAE,YAKAyB,YAKPvD,cACIoB,KAAKmC,YAAc,IAAIhC,KAC3B,C,EAMSF,EAAAoO,mBAIFjM,iBAKAsF,oBAKA8F,mBAKA9C,gBAKAP,qBAKA/C,eAUPxI,YACIsW,EACAC,EACAC,EACAC,EACAC,GAEAtV,KAAKoC,iBAAmB8S,EACxBlV,KAAK0H,oBAAsByN,EAC3BnV,KAAKwN,mBAAqB4H,EAC1BpV,KAAK0K,gBAAkB2K,EACvBrV,KAAKmK,qBAAuBmL,CAChC,C,CAGP,GAhMS1Z,MAAAA,OAAK,EAAA","file":"hicomImageAnnotation.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-namespace */\r\n\r\nnamespace Hicom.Engine.UI.TagHelper {\r\n\r\n /**\r\n * The HicomImageAnnotation class is used to manage the js for the image annotation tool. \r\n */\r\n export class HicomImageAnnotation {\r\n\r\n public AllAnnotations: DataModel.AllImageAnnotationsDM;\r\n public CurrentAnnotationNumber: number;\r\n public AnnotationCanvasCtrl: HTMLCanvasElement;\r\n public ImageCanvasCtrl: HTMLCanvasElement;\r\n public AnnotationContext: CanvasRenderingContext2D;\r\n public ImageContext: CanvasRenderingContext2D;\r\n public CurrentPathPoints: Array;\r\n public PreviousPathPoint: DataModel.PositionDM;\r\n public InflightPathPoint: DataModel.PositionDM;\r\n public IsDrawing: boolean;\r\n public ImgSrc: string;\r\n public CtrlOutterId: string;\r\n public ClickDrawingFunc: (event: PointerEvent) => void;\r\n public DblClickDrawingFunc: (event: MouseEvent) => void;\r\n public MouseDownDrawingFunc: (event: MouseEvent) => void;\r\n public MouseMoveDrawingFunc: (event: MouseEvent) => void;\r\n public MouseUpDrawingFunc: (event: MouseEvent) => void;\r\n public MouseMoveMarkerTextFunc: (event: MouseEvent) => void;\r\n public TouchStartFunc: (event: TouchEvent) => void;\r\n public PolyButtonClickFunc: (event: PointerEvent) => void;\r\n public CurrentMarkerType: Hicom.Engine.UI.TagHelper.AnnotationMarkerTypeEnum;\r\n public MarkerLineThickness: number;\r\n public MarkerLineColour: string;\r\n public MarkerFillColour: string;\r\n public MarkerHighlightLineColour: string;\r\n public MarkerHighlightFillColour: string;\r\n public AnnotationMarkerColour: string;\r\n public AnnotationTextColour: string;\r\n public AnnotationsDisplayMode: Hicom.Engine.UI.TagHelper.AnnotationsDisplayModeEnum;\r\n public ReadOnlyMode: boolean;\r\n public ToolTipCtrl: HTMLElement;\r\n public CurrentToolTipText: string;\r\n public ResxRemoveAnnotationTitle: string;\r\n public ResxRemoveAnnotationContent: string;\r\n public HighlightingToClear: boolean;\r\n public AnnotationListLocation: Hicom.Engine.UI.TagHelper.AnnotationListLocationEnum;\r\n public InTouchMode: boolean;\r\n public InPolyDrawing: boolean;\r\n public ForceWidth: number;\r\n public ForceHeight: number;\r\n public CanvasImagePartialID: string;\r\n public CanvasAnnotationPartialID: string;\r\n public HiddenAnnoJsonHolder: string;\r\n\r\n /**\r\n * The constructor of the HicomImageAnnotation class.\r\n * @param outterCtrlId - The ID of the outer control.\r\n * @param markerLineThickness - The thickness of the marker line.\r\n * @param markerLineColour - The color of the marker line.\r\n * @param markerFillColour - The color of the marker fill.\r\n * @param markerHighlightLineColour - The color of the marker highlight line.\r\n * @param markerHighlightFillColour - The color of the marker highlight fill.\r\n * @param annotationMarkerColour - The color of the annotation marker.\r\n * @param annotationTextColour - The color of the annotation text.\r\n * @param annotationsDisplayMode - The display mode of the annotations.\r\n * @param readOnlyMode - Indicates if the annotation tool is in read-only mode.\r\n * @param resxRemoveAnnotationTitle - The title for removing an annotation.\r\n * @param resxRemoveAnnotationContent - The content for removing an annotation.\r\n * @param annotationListLocation - The location of the annotation list. \r\n * @param markerType - The type of marker.\r\n * @param forceHeight - The forced height of the canvas.\r\n * @param forceWidth - The forced width of the canvas\r\n * @param canvasImagePartialID - The canvasImagePartialID\r\n * @param canvasAnnotationPartialID - The canvasAnnotationPartialID.\r\n * @param hiddenAnnoJsonHolder - The hiddenAnnoJsonHolder.\r\n */\r\n constructor(\r\n outterCtrlId: string,\r\n markerLineThickness: number,\r\n markerLineColour: string,\r\n markerFillColour: string,\r\n markerHighlightLineColour: string,\r\n markerHighlightFillColour: string,\r\n annotationMarkerColour: string,\r\n annotationTextColour: string,\r\n annotationsDisplayMode: AnnotationsDisplayModeEnum,\r\n readOnlyMode: boolean,\r\n resxRemoveAnnotationTitle: string,\r\n resxRemoveAnnotationContent: string,\r\n annotationListLocation: AnnotationListLocationEnum,\r\n markerType: string,\r\n forceHeight: number = 0,\r\n forceWidth: number = 0,\r\n canvasImagePartialID: string,\r\n canvasAnnotationPartialID: string,\r\n hiddenAnnoJsonHolder: string,\r\n ) {\r\n\r\n this.AllAnnotations = new DataModel.AllImageAnnotationsDM();\r\n this.CurrentPathPoints = new Array();\r\n this.MarkerLineThickness = markerLineThickness\r\n this.MarkerLineColour = markerLineColour;\r\n this.MarkerFillColour = markerFillColour;\r\n this.MarkerHighlightLineColour = markerHighlightLineColour;\r\n this.MarkerHighlightFillColour = markerHighlightFillColour;\r\n this.AnnotationMarkerColour = annotationMarkerColour;\r\n this.AnnotationTextColour = annotationTextColour;\r\n this.AnnotationsDisplayMode = annotationsDisplayMode;\r\n this.ReadOnlyMode = readOnlyMode;\r\n this.ResxRemoveAnnotationTitle = resxRemoveAnnotationTitle;\r\n this.ResxRemoveAnnotationContent = resxRemoveAnnotationContent;\r\n this.AnnotationListLocation = annotationListLocation;\r\n this.CanvasImagePartialID = canvasImagePartialID;\r\n this.CanvasAnnotationPartialID = canvasAnnotationPartialID;\r\n this.HiddenAnnoJsonHolder = hiddenAnnoJsonHolder;\r\n\r\n this.ImageCanvasCtrl = document.getElementById(`${this.CanvasImagePartialID}${outterCtrlId}`);\r\n this.AnnotationCanvasCtrl = document.getElementById(`${this.CanvasAnnotationPartialID}${outterCtrlId}`);\r\n this.ToolTipCtrl = document.getElementById(`iTooltip_${outterCtrlId}`);\r\n this.CtrlOutterId = outterCtrlId;\r\n\r\n let rect: DOMRect = this.AnnotationCanvasCtrl.getBoundingClientRect();\r\n\r\n this.AllAnnotations.ImageWidth = rect.width\r\n this.AllAnnotations.ImageHeight = rect.height;\r\n\r\n this.CurrentAnnotationNumber = 0;\r\n this.CurrentToolTipText = \"\";\r\n this.HighlightingToClear = false;\r\n this.InTouchMode = false;\r\n this.InPolyDrawing = false;\r\n this.CurrentMarkerType = +markerType;\r\n this.ForceWidth = forceWidth;\r\n this.ForceHeight = forceHeight;\r\n }\r\n\r\n /**\r\n * Initializes the image annotation canvas.\r\n * @param canvasImgSrc - The source of the canvas image. (i.e. data:image/png;base64,...)\r\n */\r\n public InitImgAnnoCanvas(\r\n canvasImgSrc: string) {\r\n let imgAnnClass: HicomImageAnnotation = this;\r\n imgAnnClass.AnnotationContext = this.AnnotationCanvasCtrl.getContext(\"2d\");\r\n imgAnnClass.ImageContext = this.ImageCanvasCtrl.getContext(\"2d\");\r\n\r\n //Clear out the annotations list incase there are others from previous load of the image annotation tool.\r\n imgAnnClass.removeAllAnnotationsFromList(imgAnnClass);\r\n\r\n let img = new Image();\r\n img.onload = function () {\r\n\r\n let canvasHolderDiv: HTMLDivElement = imgAnnClass.AnnotationCanvasCtrl.parentElement;\r\n let ratioHeight: number;\r\n let ratioWidth: number;\r\n\r\n if (imgAnnClass.ForceHeight == 0 && imgAnnClass.ForceWidth == 0 && (img.height > 1000 || img.width > 1000)) {\r\n // If no force has been set, we will limit the size so that the largest dimension is set at 1000px.\r\n if (img.height > img.width) {\r\n // Height is greater, ratio 1000 on height.\r\n ratioWidth = (1000 / img.height) * img.width;\r\n ratioHeight = 1000;\r\n } else {\r\n // Width is greater, ratio 1000 on width.\r\n ratioHeight = (1000 / img.width) * img.height;\r\n ratioWidth = 1000;\r\n }\r\n }\r\n else {\r\n ratioWidth = img.width;\r\n ratioHeight = img.height;\r\n }\r\n\r\n //Define a width/height of the canvas so it renders at the right resolution!\r\n if (imgAnnClass.ForceHeight > 0) {\r\n imgAnnClass.AnnotationCanvasCtrl.height = imgAnnClass.ForceHeight;\r\n imgAnnClass.ImageCanvasCtrl.height = imgAnnClass.ForceHeight;\r\n canvasHolderDiv.style.height = `${imgAnnClass.ForceHeight}px`;\r\n canvasHolderDiv.style.setProperty(`--image-height`, `${img.width}px`);\r\n } else {\r\n imgAnnClass.AnnotationCanvasCtrl.height = ratioHeight;\r\n imgAnnClass.ImageCanvasCtrl.height = ratioHeight;\r\n canvasHolderDiv.style.height = `${ratioHeight}px`;\r\n canvasHolderDiv.style.setProperty(`--image-height`, `${ratioHeight}px`);\r\n }\r\n\r\n if (imgAnnClass.ForceWidth > 0) {\r\n imgAnnClass.AnnotationCanvasCtrl.width = imgAnnClass.ForceWidth;\r\n imgAnnClass.ImageCanvasCtrl.width = imgAnnClass.ForceWidth;\r\n canvasHolderDiv.style.width = `${imgAnnClass.ForceWidth}px`;\r\n canvasHolderDiv.style.setProperty(`--image-width`, `${img.width}px`);\r\n } else {\r\n\r\n //This is done because if the image itself is less than 550 pixels wide the annotation canvas will only fill that space, meaning that the user will not be able to draw in that area even though it looks like they should be able to esspeically if the image backgroun matches the screen background.\r\n if (ratioWidth < 550) {\r\n imgAnnClass.AnnotationCanvasCtrl.width = 550;\r\n canvasHolderDiv.style.width = `550px`;\r\n canvasHolderDiv.style.setProperty(`--image-width`, `550px`);\r\n }\r\n else {\r\n imgAnnClass.AnnotationCanvasCtrl.width = ratioWidth;\r\n canvasHolderDiv.style.width = `${ratioWidth}px`;\r\n canvasHolderDiv.style.setProperty(`--image-width`, `${ratioWidth}px`);\r\n }\r\n\r\n imgAnnClass.ImageCanvasCtrl.width = ratioWidth;\r\n }\r\n\r\n let hdnImgAnnoJsonHoler: HTMLInputElement = document.getElementById(`${imgAnnClass.HiddenAnnoJsonHolder}${imgAnnClass.CtrlOutterId}`);\r\n\r\n imgAnnClass.ImageContext.drawImage(img, 0, 0, img.width, img.height, // source rectangle\r\n 0, 0, imgAnnClass.ImageCanvasCtrl.width, imgAnnClass.ImageCanvasCtrl.height); // destination rectangle\r\n\r\n if (hdnImgAnnoJsonHoler.value.length > 0) {\r\n\r\n //Load the Json passed in from the hidden field, in to the AllAnnotations property.\r\n imgAnnClass.AllAnnotations = JSON.parse(hdnImgAnnoJsonHoler.value) as DataModel.AllImageAnnotationsDM;\r\n\r\n let currentAnnotationNumber: number = 0;\r\n\r\n for (var i = 0; i < imgAnnClass.AllAnnotations.Annotations.length; i++) {\r\n if (imgAnnClass.AllAnnotations.Annotations[i].AnnotationNumber > currentAnnotationNumber) {\r\n currentAnnotationNumber = imgAnnClass.AllAnnotations.Annotations[i].AnnotationNumber;\r\n }\r\n }\r\n\r\n imgAnnClass.CurrentAnnotationNumber = currentAnnotationNumber;\r\n\r\n imgAnnClass.resetImgAnnClass(imgAnnClass, true);\r\n\r\n imgAnnClass.addAllAnnotationsToList(imgAnnClass);\r\n }\r\n };\r\n\r\n img.src = canvasImgSrc;\r\n this.ImgSrc = canvasImgSrc;\r\n\r\n //Get the div that contains the buttons.\r\n let divImgButtonContainer: HTMLDivElement = document.getElementById(`divImageAnnoBtnContainer_${imgAnnClass.CtrlOutterId}`);\r\n\r\n for (var i = 0; i < divImgButtonContainer.children.length; i++) {\r\n if (divImgButtonContainer.children[i] instanceof HTMLButtonElement) {\r\n if (divImgButtonContainer.children[i].id == `btnImageAnno_Poly_${imgAnnClass.CtrlOutterId}`) {\r\n imgAnnClass.PolyButtonClickFunc = function (e: PointerEvent) {\r\n let btn: HTMLButtonElement = this;\r\n\r\n let drawingTypeOnCtrl: string = btn.getAttribute(\"data-marker-type\");\r\n\r\n\r\n // Check if the image annotation tool is currently in drawing mode and reset the state if it is\r\n if (imgAnnClass.IsDrawing) {\r\n imgAnnClass.resetImgAnnClass(imgAnnClass, true);\r\n }\r\n\r\n //Magic unary (+) operator for converting strings to numbers\r\n let clickedMarkerType: number = +drawingTypeOnCtrl;\r\n imgAnnClass.CurrentMarkerType = clickedMarkerType;\r\n\r\n imgAnnClass.setMarkerType(btn);\r\n\r\n imgAnnClass.setMarkerHandlers(imgAnnClass);\r\n }\r\n\r\n //Assign the poly button click to a function as it will be needed when this click event is changed based\r\n divImgButtonContainer.children[i].addEventListener(\"click\", imgAnnClass.PolyButtonClickFunc);\r\n }\r\n else {\r\n divImgButtonContainer.children[i].addEventListener(\"click\", function (event: PointerEvent) {\r\n let btn: HTMLButtonElement = this;\r\n\r\n let drawingTypeOnCtrl: string = btn.getAttribute(\"data-marker-type\");\r\n\r\n // Check if the image annotation tool is currently in drawing mode and reset the state if it is\r\n if (imgAnnClass.IsDrawing) {\r\n imgAnnClass.resetImgAnnClass(imgAnnClass, true);\r\n }\r\n\r\n //Magic unary (+) operator for converting strings to numbers\r\n let clickedMarkerType: number = +drawingTypeOnCtrl;\r\n imgAnnClass.CurrentMarkerType = clickedMarkerType;\r\n\r\n imgAnnClass.setMarkerType(btn);\r\n\r\n imgAnnClass.setMarkerHandlers(imgAnnClass);\r\n });\r\n }\r\n\r\n let btn: HTMLButtonElement = divImgButtonContainer.children[i];\r\n\r\n let drawingTypeOnCtrl: string = btn.getAttribute(\"data-marker-type\");\r\n\r\n if (+drawingTypeOnCtrl == imgAnnClass.CurrentMarkerType) {\r\n imgAnnClass.setMarkerType(btn);\r\n }\r\n }\r\n }\r\n\r\n if (imgAnnClass.ReadOnlyMode) {\r\n let btnRow: HTMLDivElement = document.getElementById(`divImageAnnoBtnContainer_${imgAnnClass.CtrlOutterId}`);\r\n btnRow.style.display = \"none\";\r\n\r\n this.setupCurriedMarkerHandlersOnceEvenInReadOnly(imgAnnClass);\r\n this.setReadonlyMarkerHandlers(imgAnnClass);\r\n\r\n } else {\r\n this.setupCurriedMarkerHandlersOnce(imgAnnClass);\r\n\r\n //Magic unary (+) operator for converting strings to numbers\r\n this.setMarkerHandlers(imgAnnClass);\r\n }\r\n }\r\n\r\n /**\r\n * Sets up curried marker handlers once.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private setupCurriedMarkerHandlersOnce(imgAnnClass: HicomImageAnnotation) {\r\n //Setup all mouse functions for the canvas, depending on the marker type.\r\n imgAnnClass.ClickDrawingFunc = function (event: PointerEvent) {\r\n if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Point) {\r\n imgAnnClass.addSinglePoint(event, imgAnnClass);\r\n }\r\n else if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Poly) {\r\n imgAnnClass.addMultipleJoinedPoints(event, imgAnnClass);\r\n }\r\n }\r\n\r\n imgAnnClass.DblClickDrawingFunc = function (event: MouseEvent) {\r\n if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Poly) {\r\n imgAnnClass.closeMultiPointPath(event, imgAnnClass);\r\n }\r\n }\r\n\r\n imgAnnClass.MouseDownDrawingFunc = function (event: MouseEvent) {\r\n if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Freehand) {\r\n imgAnnClass.startFreeHandJoinedPoints(event, imgAnnClass);\r\n } else if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Arrow) {\r\n imgAnnClass.startArrowPoint(event, imgAnnClass);\r\n } else if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Circle) {\r\n imgAnnClass.startCirclePoint(event, imgAnnClass);\r\n }\r\n }\r\n\r\n imgAnnClass.MouseMoveDrawingFunc = function (event: MouseEvent) {\r\n if (imgAnnClass.IsDrawing) {\r\n if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Freehand) {\r\n imgAnnClass.moveFreeHandJoinedPoints(event, imgAnnClass);\r\n } else if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Arrow) {\r\n imgAnnClass.moveArrowJoinedPoints(event, imgAnnClass);\r\n } else if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Circle) {\r\n imgAnnClass.moveCircleJoinedPoints(event, imgAnnClass);\r\n }\r\n }\r\n else {\r\n imgAnnClass.checkForAnnotationMarkerHit(imgAnnClass, event);\r\n }\r\n }\r\n\r\n imgAnnClass.MouseUpDrawingFunc = function (event: MouseEvent) {\r\n if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Freehand) {\r\n imgAnnClass.endFreeHandJoinedPoints(event, imgAnnClass);\r\n } else if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Arrow) {\r\n imgAnnClass.endArrowPoint(event, imgAnnClass);\r\n } else if (imgAnnClass.CurrentMarkerType == AnnotationMarkerTypeEnum.Circle) {\r\n imgAnnClass.endCirclePoint(event, imgAnnClass);\r\n }\r\n }\r\n\r\n imgAnnClass.TouchStartFunc = function (event: TouchEvent) {\r\n imgAnnClass.touchModeON(imgAnnClass);\r\n }\r\n\r\n imgAnnClass.setupCurriedMarkerHandlersOnceEvenInReadOnly(imgAnnClass);\r\n }\r\n\r\n /**\r\n * Sets up curried marker handlers once even in read-only mode.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private setupCurriedMarkerHandlersOnceEvenInReadOnly(imgAnnClass: HicomImageAnnotation) {\r\n imgAnnClass.MouseMoveMarkerTextFunc = function (event: MouseEvent) {\r\n if (imgAnnClass.IsDrawing == false) {\r\n imgAnnClass.checkForAnnotationMarkerHit(imgAnnClass, event);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets the marker handlers.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private setMarkerHandlers(imgAnnClass: HicomImageAnnotation) {\r\n //Remove any of the functions from the event listeners.\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"click\", imgAnnClass.ClickDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"dblclick\", imgAnnClass.DblClickDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"mousedown\", imgAnnClass.MouseDownDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"mousemove\", imgAnnClass.MouseMoveDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"mouseup\", imgAnnClass.MouseUpDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"mousemove\", imgAnnClass.MouseMoveMarkerTextFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"touchstart\", imgAnnClass.TouchStartFunc);\r\n\r\n //Add the correct event listeners back in depending on the marker type.\r\n switch (imgAnnClass.CurrentMarkerType) {\r\n case AnnotationMarkerTypeEnum.Point:\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"click\", imgAnnClass.ClickDrawingFunc);\r\n break;\r\n case AnnotationMarkerTypeEnum.Arrow:\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"mousedown\", imgAnnClass.MouseDownDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"mousemove\", imgAnnClass.MouseMoveDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"mouseup\", imgAnnClass.MouseUpDrawingFunc);\r\n\r\n break;\r\n case AnnotationMarkerTypeEnum.Poly:\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"click\", imgAnnClass.ClickDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"dblclick\", imgAnnClass.DblClickDrawingFunc);\r\n\r\n break;\r\n case AnnotationMarkerTypeEnum.Freehand:\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"mousedown\", imgAnnClass.MouseDownDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"mousemove\", imgAnnClass.MouseMoveDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"mouseup\", imgAnnClass.MouseUpDrawingFunc);\r\n\r\n break;\r\n case AnnotationMarkerTypeEnum.Circle:\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"mousedown\", imgAnnClass.MouseDownDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"mousemove\", imgAnnClass.MouseMoveDrawingFunc);\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"mouseup\", imgAnnClass.MouseUpDrawingFunc);\r\n\r\n break;\r\n default:\r\n throw new DOMException(\"Marker type has not been selected.\");\r\n }\r\n\r\n document.addEventListener(\"touchstart\", imgAnnClass.TouchStartFunc);\r\n\r\n imgAnnClass.setReadonlyMarkerHandlers(imgAnnClass);\r\n }\r\n\r\n /**\r\n * Sets the read-only marker handlers.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private setReadonlyMarkerHandlers(imgAnnClass: HicomImageAnnotation) {\r\n //Remove any of the functions from the event listeners.\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"mousemove\", imgAnnClass.MouseMoveMarkerTextFunc);\r\n\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"mousemove\", imgAnnClass.MouseMoveMarkerTextFunc);\r\n }\r\n\r\n /**\r\n * Sets the marker type.\r\n * @param btn - The button element.\r\n */\r\n private setMarkerType(btn: HTMLButtonElement) {\r\n let divImgButtonContainer: HTMLDivElement = btn.parentElement;\r\n\r\n if (divImgButtonContainer) {\r\n for (var i = 0; i < divImgButtonContainer.children.length; i++) {\r\n divImgButtonContainer.children[i].classList.remove(\"active\");\r\n }\r\n }\r\n\r\n btn.classList.add(\"active\");\r\n }\r\n\r\n /**\r\n * Handle when the image annotation tool goes in to touch mode.\r\n * @param imgAnnClass\r\n */\r\n private touchModeON(imgAnnClass: HicomImageAnnotation) {\r\n if (imgAnnClass.InTouchMode == false) {\r\n imgAnnClass.InTouchMode = true;\r\n\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"dblclick\", imgAnnClass.DblClickDrawingFunc);\r\n\r\n let arrowBtn: HTMLButtonElement = document.getElementById(`btnImageAnno_Arrow_${imgAnnClass.CtrlOutterId}`);\r\n let freehandBtn: HTMLButtonElement = document.getElementById(`btnImageAnno_Freehand_${imgAnnClass.CtrlOutterId}`);\r\n let circleBtn: HTMLButtonElement = document.getElementById(`btnImageAnno_Circle_${imgAnnClass.CtrlOutterId}`);\r\n let polyBtn: HTMLButtonElement = document.getElementById(`btnImageAnno_Poly_${imgAnnClass.CtrlOutterId}`);\r\n\r\n arrowBtn.style.display = \"none\";\r\n freehandBtn.style.display = \"none\";\r\n circleBtn.style.display = \"none\";\r\n\r\n polyBtn.lastChild.textContent = \"Poly\";\r\n }\r\n }\r\n\r\n /**\r\n * Handle when the image annotation tool comes out of touch mode.\r\n * @param imgAnnClass\r\n */\r\n private touchModeOFF(imgAnnClass: HicomImageAnnotation) {\r\n if (imgAnnClass.InTouchMode) {\r\n imgAnnClass.InTouchMode = false;\r\n\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"dblclick\", imgAnnClass.DblClickDrawingFunc);\r\n\r\n let arrowBtn: HTMLButtonElement = document.getElementById(`btnImageAnno_Arrow_${imgAnnClass.CtrlOutterId}`);\r\n let freehandBtn: HTMLButtonElement = document.getElementById(`btnImageAnno_Freehand_${imgAnnClass.CtrlOutterId}`);\r\n let circleBtn: HTMLButtonElement = document.getElementById(`btnImageAnno_Circle_${imgAnnClass.CtrlOutterId}`);\r\n let polyBtn: HTMLButtonElement = document.getElementById(`btnImageAnno_Poly_${imgAnnClass.CtrlOutterId}`);\r\n\r\n arrowBtn.style.display = \"\";\r\n freehandBtn.style.display = \"\";\r\n circleBtn.style.display = \"\";\r\n\r\n polyBtn.lastChild.textContent = \"Poly (double click to close)\";\r\n }\r\n }\r\n\r\n /**\r\n * Adds a single point annotation.\r\n * @param event - The pointer event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private addSinglePoint(event: PointerEvent, imgAnnClass: HicomImageAnnotation) {\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosPointerEvent(imgAnnClass.AnnotationCanvasCtrl, event);\r\n\r\n imgAnnClass.drawSinglePoint(imgAnnClass, posInfo);\r\n\r\n imgAnnClass.CurrentPathPoints.push(new DataModel.PositionDM(posInfo.X, posInfo.Y));\r\n\r\n let annotationDialogue = imgAnnClass.setupKendoAnnotationDialog(function (e) {\r\n\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"click\", imgAnnClass.ClickDrawingFunc);\r\n\r\n imgAnnClass.annotationOkayFunction(imgAnnClass, AnnotationMarkerTypeEnum.Point, e);\r\n\r\n imgAnnClass.drawAnnotationMarker(imgAnnClass, imgAnnClass.AllAnnotations.Annotations[imgAnnClass.AllAnnotations.Annotations.length - 1], imgAnnClass.CurrentPathPoints[0]);\r\n\r\n imgAnnClass.resetImgAnnClass(imgAnnClass);\r\n\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"click\", imgAnnClass.ClickDrawingFunc);\r\n }, function (e) {\r\n imgAnnClass.resetImgAnnClass(imgAnnClass);\r\n imgAnnClass.redrawAll(imgAnnClass);\r\n e.sender.close();\r\n e.sender.destroy();\r\n }, imgAnnClass);\r\n\r\n $(annotationDialogue).data(\"kendoDialog\").open();\r\n imgAnnClass.setMarkerHandlers(imgAnnClass);\r\n }\r\n\r\n /**\r\n * Adds multiple joined points for annotation.\r\n * @param event - The pointer event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private addMultipleJoinedPoints(\r\n event: PointerEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosPointerEvent(imgAnnClass.AnnotationCanvasCtrl, event);\r\n\r\n this.drawSinglePoint(imgAnnClass, posInfo);\r\n\r\n imgAnnClass.CurrentPathPoints.push(new DataModel.PositionDM(posInfo.X, posInfo.Y));\r\n\r\n if (imgAnnClass.CurrentPathPoints.length > 1) {\r\n\r\n //Draw a path between this one and the one before it.\r\n imgAnnClass.drawLine(imgAnnClass, imgAnnClass.CurrentPathPoints[imgAnnClass.CurrentPathPoints.length - 2], imgAnnClass.CurrentPathPoints[imgAnnClass.CurrentPathPoints.length - 1]);\r\n }\r\n\r\n if (imgAnnClass.InTouchMode) {\r\n let polyBtn: HTMLButtonElement = document.getElementById(`btnImageAnno_Poly_${imgAnnClass.CtrlOutterId}`);\r\n\r\n if (imgAnnClass.CurrentPathPoints.length < 3) {\r\n polyBtn.lastChild.textContent = \"Remove current points (minimum three required)\";\r\n } else {\r\n polyBtn.lastChild.textContent = \"Complete poly\";\r\n }\r\n\r\n if (imgAnnClass.InPolyDrawing == false) {\r\n imgAnnClass.InPolyDrawing = true;\r\n\r\n polyBtn.removeEventListener(\"click\", imgAnnClass.PolyButtonClickFunc);\r\n\r\n let inPolyDrawingFunc = function (e: MouseEvent) {\r\n if (imgAnnClass.CurrentPathPoints.length < 3) {\r\n imgAnnClass.resetImgAnnClass(imgAnnClass, true);\r\n\r\n polyBtn.addEventListener(\"click\", imgAnnClass.PolyButtonClickFunc);\r\n polyBtn.removeEventListener(\"click\", inPolyDrawingFunc);\r\n }\r\n else {\r\n imgAnnClass.closeMultiPointPath(e, imgAnnClass);\r\n\r\n polyBtn.addEventListener(\"click\", imgAnnClass.PolyButtonClickFunc);\r\n polyBtn.removeEventListener(\"click\", inPolyDrawingFunc);\r\n }\r\n }\r\n\r\n polyBtn.addEventListener(\"click\", inPolyDrawingFunc);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Closes the multi-point path for annotation.\r\n * @param event - The mouse event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private closeMultiPointPath(\r\n event: MouseEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n if (imgAnnClass.CurrentPathPoints.length >= 3) {\r\n\r\n if (imgAnnClass.InTouchMode == false) {\r\n //Remove the last posistion from the path array as this will always be recorded by the single click just before the double.\r\n imgAnnClass.CurrentPathPoints.pop();\r\n }\r\n else {\r\n imgAnnClass.AnnotationCanvasCtrl.removeEventListener(\"click\", imgAnnClass.ClickDrawingFunc);\r\n }\r\n\r\n //Draw a line between the last point and the first point in the current path array.\r\n imgAnnClass.drawLine(imgAnnClass, imgAnnClass.CurrentPathPoints[0], imgAnnClass.CurrentPathPoints[imgAnnClass.CurrentPathPoints.length - 1]);\r\n\r\n // last point is the origin.\r\n imgAnnClass.CurrentPathPoints.push(new DataModel.PositionDM(imgAnnClass.CurrentPathPoints[0].X, imgAnnClass.CurrentPathPoints[0].Y));\r\n\r\n let annotationDialogue = imgAnnClass.setupKendoAnnotationDialog(function (e) {\r\n\r\n imgAnnClass.annotationOkayFunction(imgAnnClass, AnnotationMarkerTypeEnum.Poly, e);\r\n\r\n imgAnnClass.drawAnnotationMarker(imgAnnClass, imgAnnClass.AllAnnotations.Annotations[imgAnnClass.AllAnnotations.Annotations.length - 1], imgAnnClass.CurrentPathPoints[0]);\r\n\r\n imgAnnClass.resetImgAnnClass(imgAnnClass);\r\n\r\n if (imgAnnClass.InTouchMode) {\r\n imgAnnClass.AnnotationCanvasCtrl.addEventListener(\"click\", imgAnnClass.ClickDrawingFunc);\r\n\r\n let polyBtn: HTMLButtonElement = document.getElementById(`btnImageAnno_Poly_${imgAnnClass.CtrlOutterId}`);\r\n\r\n polyBtn.lastChild.textContent = \"Poly\";\r\n\r\n imgAnnClass.InPolyDrawing = false;\r\n }\r\n }, function (e) {\r\n imgAnnClass.resetImgAnnClass(imgAnnClass);\r\n imgAnnClass.redrawAll(imgAnnClass);\r\n e.sender.close();\r\n e.sender.destroy();\r\n }, imgAnnClass);\r\n\r\n $(annotationDialogue).data(\"kendoDialog\").open();\r\n imgAnnClass.setMarkerHandlers(imgAnnClass);\r\n }\r\n }\r\n\r\n /**\r\n * Starts freehand drawing for annotation.\r\n * @param event - The mouse event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private startFreeHandJoinedPoints(\r\n event: MouseEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosMouseEvent(imgAnnClass.AnnotationCanvasCtrl, event);\r\n\r\n imgAnnClass.CurrentPathPoints.push(new DataModel.PositionDM(posInfo.X, posInfo.Y));\r\n\r\n imgAnnClass.IsDrawing = true;\r\n }\r\n\r\n /**\r\n * Moves freehand drawing for annotation.\r\n * @param event - The mouse event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private moveFreeHandJoinedPoints(\r\n event: MouseEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosMouseEvent(imgAnnClass.AnnotationCanvasCtrl, event);\r\n\r\n let lengthOfPoints: number = imgAnnClass.CurrentPathPoints.length - 1;\r\n\r\n imgAnnClass.drawLine(imgAnnClass, posInfo, imgAnnClass.CurrentPathPoints[lengthOfPoints]);\r\n\r\n imgAnnClass.CurrentPathPoints.push(new DataModel.PositionDM(posInfo.X, posInfo.Y));\r\n }\r\n\r\n /**\r\n * Ends freehand drawing for annotation.\r\n * @param event - The mouse event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private endFreeHandJoinedPoints(\r\n event: MouseEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n if (imgAnnClass.CurrentPathPoints.length >= 3) {\r\n\r\n imgAnnClass.drawLine(imgAnnClass, imgAnnClass.CurrentPathPoints[0], imgAnnClass.CurrentPathPoints[imgAnnClass.CurrentPathPoints.length - 1]);\r\n\r\n let annotationDialogue = imgAnnClass.setupKendoAnnotationDialog(function (e) {\r\n imgAnnClass.annotationOkayFunction(imgAnnClass, AnnotationMarkerTypeEnum.Freehand, e);\r\n\r\n //Annotation marker is drawn in the redraw method.\r\n\r\n imgAnnClass.resetImgAnnClass(imgAnnClass, true);\r\n }, function (e) {\r\n imgAnnClass.resetImgAnnClass(imgAnnClass);\r\n imgAnnClass.redrawAll(imgAnnClass);\r\n e.sender.close();\r\n e.sender.destroy();\r\n }, imgAnnClass);\r\n\r\n $(annotationDialogue).data(\"kendoDialog\").open();\r\n imgAnnClass.setMarkerHandlers(imgAnnClass);\r\n }\r\n }\r\n\r\n /**\r\n * Starts drawing an arrow for annotation.\r\n * @param event - The mouse event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private startArrowPoint(\r\n event: MouseEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosMouseEvent(imgAnnClass.AnnotationCanvasCtrl, event);\r\n\r\n imgAnnClass.CurrentPathPoints.push(new DataModel.PositionDM(posInfo.X, posInfo.Y));\r\n\r\n imgAnnClass.IsDrawing = true;\r\n }\r\n\r\n /**\r\n * Moves the arrow drawing for annotation.\r\n * @param event - The mouse event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private moveArrowJoinedPoints(\r\n event: MouseEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n if (imgAnnClass.IsDrawing) {\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosMouseEvent(imgAnnClass.AnnotationCanvasCtrl, event);\r\n\r\n imgAnnClass.InflightPathPoint = new DataModel.PositionDM(posInfo.X, posInfo.Y);\r\n\r\n if (imgAnnClass.PreviousPathPoint) {\r\n imgAnnClass.drawLine(imgAnnClass, imgAnnClass.PreviousPathPoint, imgAnnClass.InflightPathPoint);\r\n }\r\n\r\n imgAnnClass.PreviousPathPoint = new DataModel.PositionDM(posInfo.X, posInfo.Y);\r\n }\r\n }\r\n\r\n /**\r\n * Ends drawing an arrow for annotation.\r\n * @param event - The mouse event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private endArrowPoint(\r\n event: MouseEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosMouseEvent(imgAnnClass.AnnotationCanvasCtrl, event);\r\n imgAnnClass.CurrentPathPoints.push(new DataModel.PositionDM(posInfo.X, posInfo.Y));\r\n\r\n imgAnnClass.drawArrow(imgAnnClass, imgAnnClass.CurrentPathPoints[0], imgAnnClass.CurrentPathPoints[imgAnnClass.CurrentPathPoints.length - 1]);\r\n\r\n let annotationDialogue = imgAnnClass.setupKendoAnnotationDialog(function (e) {\r\n imgAnnClass.annotationOkayFunction(imgAnnClass, AnnotationMarkerTypeEnum.Arrow, e);\r\n\r\n //Annotation marker is drawn in the redraw method.\r\n\r\n imgAnnClass.resetImgAnnClass(imgAnnClass, true);\r\n }, function (e) {\r\n imgAnnClass.resetImgAnnClass(imgAnnClass);\r\n imgAnnClass.redrawAll(imgAnnClass);\r\n e.sender.close();\r\n e.sender.destroy();\r\n }, imgAnnClass);\r\n\r\n $(annotationDialogue).data(\"kendoDialog\").open();\r\n imgAnnClass.setMarkerHandlers(imgAnnClass);\r\n }\r\n\r\n /**\r\n * Starts drawing a circle for annotation.\r\n * @param event - The mouse event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private startCirclePoint(\r\n event: MouseEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosMouseEvent(imgAnnClass.AnnotationCanvasCtrl, event);\r\n\r\n imgAnnClass.CurrentPathPoints.push(new DataModel.PositionDM(posInfo.X, posInfo.Y));\r\n\r\n imgAnnClass.IsDrawing = true;\r\n }\r\n\r\n /**\r\n * Moves the circle drawing for annotation.\r\n * @param event - The mouse event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private moveCircleJoinedPoints(\r\n event: MouseEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n if (imgAnnClass.IsDrawing) {\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosMouseEvent(imgAnnClass.AnnotationCanvasCtrl, event);\r\n\r\n imgAnnClass.InflightPathPoint = new DataModel.PositionDM(posInfo.X, posInfo.Y);\r\n\r\n if (imgAnnClass.PreviousPathPoint) {\r\n imgAnnClass.drawLine(imgAnnClass, imgAnnClass.PreviousPathPoint, imgAnnClass.InflightPathPoint);\r\n }\r\n\r\n imgAnnClass.PreviousPathPoint = new DataModel.PositionDM(posInfo.X, posInfo.Y);\r\n }\r\n }\r\n\r\n /**\r\n * Ends drawing a circle for annotation.\r\n * @param event - The mouse event.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private endCirclePoint(\r\n event: MouseEvent,\r\n imgAnnClass: HicomImageAnnotation) {\r\n\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosMouseEvent(imgAnnClass.AnnotationCanvasCtrl, event);\r\n imgAnnClass.CurrentPathPoints.push(new DataModel.PositionDM(posInfo.X, posInfo.Y));\r\n\r\n imgAnnClass.drawCricle(imgAnnClass, imgAnnClass.CurrentPathPoints[0], imgAnnClass.CurrentPathPoints[imgAnnClass.CurrentPathPoints.length - 1]);\r\n let annotationDialogue = imgAnnClass.setupKendoAnnotationDialog(function (e) {\r\n imgAnnClass.annotationOkayFunction(imgAnnClass, AnnotationMarkerTypeEnum.Circle, e);\r\n\r\n //Annotation marker is drawn in the redraw method.\r\n\r\n imgAnnClass.resetImgAnnClass(imgAnnClass, true);\r\n }, function (e) {\r\n imgAnnClass.resetImgAnnClass(imgAnnClass);\r\n imgAnnClass.redrawAll(imgAnnClass);\r\n e.sender.close();\r\n e.sender.destroy();\r\n }, imgAnnClass);\r\n\r\n $(annotationDialogue).data(\"kendoDialog\").open();\r\n imgAnnClass.setMarkerHandlers(imgAnnClass);\r\n }\r\n\r\n /**\r\n * Checks for annotation marker hit.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param e - The mouse event.\r\n */\r\n private checkForAnnotationMarkerHit(imgAnnClass: HicomImageAnnotation, e: MouseEvent) {\r\n //Highlights the associated annotation AND show the short description under the cursor.\r\n let posInfo: DataModel.PositionDM = imgAnnClass.getMousePosMouseEvent(imgAnnClass.AnnotationCanvasCtrl, e);\r\n\r\n let anyFound: boolean = false;\r\n\r\n for (var i = 0; i < imgAnnClass.AllAnnotations.Annotations.length; i++) {\r\n let annoToCheck: DataModel.AnnotationDM = imgAnnClass.AllAnnotations.Annotations[i];\r\n\r\n if (annoToCheck.MarkerLocation) {\r\n if ((posInfo.X > annoToCheck.MarkerLocation.TopLeft.X && posInfo.X < annoToCheck.MarkerLocation.BottomRight.X) && (posInfo.Y > annoToCheck.MarkerLocation.TopLeft.Y && posInfo.Y < annoToCheck.MarkerLocation.BottomRight.Y)) {\r\n\r\n imgAnnClass.ToolTipCtrl.style.top = `${posInfo.Y}px`;\r\n imgAnnClass.ToolTipCtrl.style.left = `${posInfo.X}px`;\r\n\r\n imgAnnClass.ToolTipCtrl.setAttribute(\"data-annotation\", annoToCheck.AnnotationShortDesc);\r\n\r\n if (imgAnnClass.CurrentToolTipText.length == 0) {\r\n\r\n if (annoToCheck.AnnotationShortDesc.length > 0) {\r\n $(imgAnnClass.ToolTipCtrl).show();\r\n\r\n imgAnnClass.CurrentToolTipText = annoToCheck.AnnotationShortDesc;\r\n }\r\n else {\r\n //We need to set it too something so that it does not keep getting updated.\r\n imgAnnClass.CurrentToolTipText = `${annoToCheck.AnnotationNumber}`;\r\n }\r\n\r\n imgAnnClass.drawAddHighlighting(annoToCheck, imgAnnClass);\r\n imgAnnClass.HighlightingToClear = true;\r\n\r\n //Update the list item.\r\n this.setAnnotationLiActive(imgAnnClass, annoToCheck);\r\n }\r\n else if (imgAnnClass.CurrentToolTipText == annoToCheck.AnnotationShortDesc || (annoToCheck.AnnotationShortDesc.length == 0 && imgAnnClass.CurrentToolTipText == `${annoToCheck.AnnotationNumber}`)) {\r\n\r\n if (annoToCheck.AnnotationShortDesc.length > 0) {\r\n $(imgAnnClass.ToolTipCtrl).show();\r\n }\r\n\r\n if (imgAnnClass.HighlightingToClear == false) {\r\n imgAnnClass.HighlightingToClear = true;\r\n\r\n imgAnnClass.drawAddHighlighting(annoToCheck, imgAnnClass);\r\n\r\n //Update the list item.\r\n this.setAnnotationLiActive(imgAnnClass, annoToCheck);\r\n }\r\n }\r\n else if (imgAnnClass.CurrentToolTipText != annoToCheck.AnnotationShortDesc || (annoToCheck.AnnotationShortDesc.length == 0 && imgAnnClass.CurrentToolTipText != `${annoToCheck.AnnotationNumber}`)) {\r\n\r\n if (annoToCheck.AnnotationShortDesc.length > 0) {\r\n $(imgAnnClass.ToolTipCtrl).show();\r\n\r\n imgAnnClass.CurrentToolTipText = annoToCheck.AnnotationShortDesc;\r\n }\r\n else {\r\n //We need to set it too something so that it does not keep getting updated.\r\n imgAnnClass.CurrentToolTipText = `${annoToCheck.AnnotationNumber}`;\r\n }\r\n\r\n imgAnnClass.HighlightingToClear = true;\r\n\r\n imgAnnClass.drawAddHighlighting(annoToCheck, imgAnnClass);\r\n\r\n //Update the list item.\r\n this.setAnnotationLiActive(imgAnnClass, annoToCheck);\r\n }\r\n\r\n anyFound = true;\r\n }\r\n }\r\n }\r\n\r\n if (anyFound == false) {\r\n $(imgAnnClass.ToolTipCtrl).hide();\r\n\r\n if (imgAnnClass.HighlightingToClear) {\r\n imgAnnClass.redrawAll(imgAnnClass);\r\n imgAnnClass.HighlightingToClear = false;\r\n imgAnnClass.removeActiveFromAnnotationList(imgAnnClass);\r\n }\r\n }\r\n }\r\n\r\n //#region helpers\r\n\r\n //#region Drawing helpers\r\n\r\n /**\r\n * Draws a single point on the annotation canvas.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param posInfo - The position information of the point.\r\n * @param highlight - Indicates if the point should be highlighted.\r\n */\r\n private drawSinglePoint(imgAnnClass: HicomImageAnnotation, posInfo: DataModel.PositionDM, highlight: boolean = false) {\r\n imgAnnClass.AnnotationContext.beginPath();\r\n\r\n if (highlight) {\r\n imgAnnClass.AnnotationContext.fillStyle = imgAnnClass.MarkerHighlightFillColour;\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerHighlightLineColour;\r\n }\r\n else {\r\n imgAnnClass.AnnotationContext.fillStyle = imgAnnClass.MarkerFillColour;\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerLineColour;\r\n }\r\n\r\n imgAnnClass.AnnotationContext.lineWidth = imgAnnClass.MarkerLineThickness;\r\n imgAnnClass.AnnotationContext.arc(posInfo.X, posInfo.Y, 5, 0, 2 * Math.PI);\r\n imgAnnClass.AnnotationContext.fill();\r\n imgAnnClass.AnnotationContext.stroke();\r\n }\r\n\r\n /**\r\n * Draws a line on the annotation canvas.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param startPoint - The starting point of the line.\r\n * @param endPoint - The ending point of the line.\r\n * @param highlight - Indicates if the line should be highlighted.\r\n */\r\n private drawLine(imgAnnClass: HicomImageAnnotation, startPoint: DataModel.PositionDM, endPoint: DataModel.PositionDM, highlight: boolean = false) {\r\n imgAnnClass.AnnotationContext.beginPath();\r\n imgAnnClass.AnnotationContext.moveTo(startPoint.X, startPoint.Y);\r\n imgAnnClass.AnnotationContext.lineTo(endPoint.X, endPoint.Y);\r\n imgAnnClass.AnnotationContext.lineWidth = imgAnnClass.MarkerLineThickness;\r\n\r\n if (highlight) {\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerHighlightLineColour;\r\n }\r\n else {\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerLineColour;\r\n }\r\n\r\n imgAnnClass.AnnotationContext.stroke();\r\n }\r\n\r\n /**\r\n * Draws a circle on the annotation canvas.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param firstPoint - The first point of the circle.\r\n * @param lastPoint - The last point of the circle.\r\n * @param highlight - Indicates if the circle should be highlighted.\r\n */\r\n private drawCricle(imgAnnClass: HicomImageAnnotation, firstPoint: DataModel.PositionDM, lastPoint: DataModel.PositionDM, highlight: boolean = false) {\r\n let radius: number = imgAnnClass.lineDistance(firstPoint, lastPoint);\r\n\r\n imgAnnClass.AnnotationContext.beginPath();\r\n imgAnnClass.AnnotationContext.arc(firstPoint.X, firstPoint.Y, radius, 0, 2 * Math.PI, false);\r\n imgAnnClass.AnnotationContext.lineWidth = imgAnnClass.MarkerLineThickness;\r\n\r\n if (highlight) {\r\n imgAnnClass.AnnotationContext.fillStyle = imgAnnClass.MarkerHighlightFillColour;\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerHighlightLineColour;\r\n imgAnnClass.AnnotationContext.fill();\r\n }\r\n else {\r\n imgAnnClass.AnnotationContext.fillStyle = imgAnnClass.MarkerFillColour;\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerLineColour;\r\n }\r\n\r\n imgAnnClass.AnnotationContext.stroke();\r\n }\r\n\r\n /**\r\n * Draws an arrow on the annotation canvas.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param firstPoint - The starting point of the arrow.\r\n * @param lastPoint - The ending point of the arrow.\r\n * @param highlight - Indicates if the arrow should be highlighted.\r\n */\r\n private drawArrow(imgAnnClass: HicomImageAnnotation, firstPoint: DataModel.PositionDM, lastPoint: DataModel.PositionDM, highlight: boolean = false) {\r\n imgAnnClass.AnnotationContext.beginPath();\r\n imgAnnClass.AnnotationContext.moveTo(firstPoint.X, firstPoint.Y);\r\n imgAnnClass.AnnotationContext.lineTo(lastPoint.X, lastPoint.Y);\r\n imgAnnClass.AnnotationContext.lineWidth = imgAnnClass.MarkerLineThickness;\r\n\r\n if (highlight) {\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerHighlightLineColour;\r\n }\r\n else {\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerLineColour;\r\n }\r\n\r\n let startSize: number = 10;\r\n let endSize: number = 10;\r\n\r\n if (endSize > 0) {\r\n let lineAngle: number = Math.atan2(firstPoint.Y - lastPoint.Y, firstPoint.X - lastPoint.X);\r\n let delta: number = Math.PI / 6;\r\n for (var i = 0; i < 2; i++) {\r\n imgAnnClass.AnnotationContext.moveTo(lastPoint.X, lastPoint.Y);\r\n let x = lastPoint.X + endSize * Math.cos(lineAngle + delta);\r\n let y = lastPoint.Y + endSize * Math.sin(lineAngle + delta);\r\n imgAnnClass.AnnotationContext.lineTo(x, y);\r\n imgAnnClass.AnnotationContext.lineWidth = imgAnnClass.MarkerLineThickness;\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerLineColour;\r\n\r\n if (highlight) {\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerHighlightLineColour;\r\n }\r\n else {\r\n imgAnnClass.AnnotationContext.strokeStyle = imgAnnClass.MarkerLineColour;\r\n }\r\n\r\n delta *= -1;\r\n }\r\n }\r\n imgAnnClass.AnnotationContext.stroke();\r\n imgAnnClass.AnnotationContext.closePath();\r\n }\r\n\r\n /**\r\n * Draws an annotation marker on the annotation canvas.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param annotationToAdd - The annotation to add.\r\n * @param annotationMarkPoint - The position of the annotation marker.\r\n */\r\n private drawAnnotationMarker(imgAnnClass: HicomImageAnnotation, annotationToAdd: DataModel.AnnotationDM, annotationMarkPoint: DataModel.PositionDM) {\r\n\r\n //Saves the AnnotationContext's styles and other bits, we will restore to this at the end of this method.\r\n imgAnnClass.AnnotationContext.save();\r\n let annotationNumLength: number = annotationToAdd.AnnotationNumber.toString().length;\r\n\r\n let workingX: number;\r\n let workingY: number;\r\n\r\n if (annotationToAdd.AnnotationMarkerType == AnnotationMarkerTypeEnum.Circle) {\r\n if (annotationNumLength == 1) {\r\n workingX = annotationMarkPoint.X - 10;\r\n } else if (annotationNumLength == 2) {\r\n workingX = annotationMarkPoint.X - 15;\r\n } else if (annotationNumLength == 3) {\r\n workingX = annotationMarkPoint.X - 20;\r\n } else if (annotationNumLength == 4) {\r\n workingX = annotationMarkPoint.X - 25;\r\n }\r\n\r\n workingY = annotationMarkPoint.Y - 10;\r\n } else {\r\n workingX = annotationMarkPoint.X + 10;\r\n workingY = annotationMarkPoint.Y - 25;\r\n }\r\n\r\n let atTop: boolean = false;\r\n\r\n //Handle if the annotation marker is off the top.\r\n if (workingY <= 0) {\r\n workingY = 2;\r\n atTop = true;\r\n }\r\n\r\n imgAnnClass.AnnotationContext.beginPath();\r\n let widthSetTo: number = 0;\r\n\r\n if (annotationNumLength == 1) {\r\n\r\n if (workingX > (imgAnnClass.AnnotationCanvasCtrl.width - 22)) {\r\n if (atTop) {\r\n //Handle if the annotation marker is off both the top and right\r\n workingX = imgAnnClass.AnnotationCanvasCtrl.width - 32;\r\n workingY = workingY + 10;\r\n }\r\n else {\r\n\r\n //Handle if the annotation marker is off the right side.\r\n workingX = imgAnnClass.AnnotationCanvasCtrl.width - 22;\r\n }\r\n }\r\n\r\n widthSetTo = 20;\r\n imgAnnClass.AnnotationContext.roundRect(workingX, workingY, widthSetTo, 20, [5]);\r\n\r\n } else if (annotationNumLength == 2) {\r\n\r\n if (workingX > (imgAnnClass.AnnotationCanvasCtrl.width - 32)) {\r\n if (atTop) {\r\n //Handle if the annotation marker is off both the top and right\r\n workingX = imgAnnClass.AnnotationCanvasCtrl.width - 42;\r\n workingY = workingY + 10;\r\n }\r\n else {\r\n\r\n //Handle if the annotation marker is off the right side.\r\n workingX = imgAnnClass.AnnotationCanvasCtrl.width - 32;\r\n }\r\n }\r\n\r\n widthSetTo = 30;\r\n imgAnnClass.AnnotationContext.roundRect(workingX, workingY, widthSetTo, 20, [5]);\r\n } else if (annotationNumLength == 3) {\r\n\r\n\r\n if (workingX > (imgAnnClass.AnnotationCanvasCtrl.width - 42)) {\r\n if (atTop) {\r\n //Handle if the annotation marker is off both the top and right\r\n workingX = imgAnnClass.AnnotationCanvasCtrl.width - 52;\r\n workingY = workingY + 10;\r\n }\r\n else {\r\n\r\n //Handle if the annotation marker is off the right side.\r\n workingX = imgAnnClass.AnnotationCanvasCtrl.width - 42;\r\n }\r\n }\r\n\r\n widthSetTo = 40;\r\n imgAnnClass.AnnotationContext.roundRect(workingX, workingY, widthSetTo, 20, [5]);\r\n } else if (annotationNumLength == 4) {\r\n\r\n if (workingX > (imgAnnClass.AnnotationCanvasCtrl.width - 52)) {\r\n if (atTop) {\r\n //Handle if the annotation marker is off both the top and right\r\n workingX = imgAnnClass.AnnotationCanvasCtrl.width - 62;\r\n workingY = workingY + 10;\r\n }\r\n else {\r\n\r\n //Handle if the annotation marker is off the right side.\r\n workingX = imgAnnClass.AnnotationCanvasCtrl.width - 52;\r\n }\r\n }\r\n\r\n widthSetTo = 50;\r\n imgAnnClass.AnnotationContext.roundRect(workingX, workingY, widthSetTo, 20, [5]);\r\n }\r\n\r\n imgAnnClass.AnnotationContext.stroke();\r\n\r\n imgAnnClass.AnnotationContext.fillStyle = imgAnnClass.AnnotationMarkerColour;\r\n imgAnnClass.AnnotationContext.fill();\r\n\r\n // Add the fill text.\r\n imgAnnClass.AnnotationContext.font = \"bold 16px Rubik, sans-serif\";\r\n imgAnnClass.AnnotationContext.fillStyle = imgAnnClass.AnnotationTextColour;\r\n\r\n imgAnnClass.AnnotationContext.fillText(annotationToAdd.AnnotationNumber.toString(), workingX + 6, workingY + 15);\r\n\r\n //Restore back to previous styles\r\n imgAnnClass.AnnotationContext.restore();\r\n\r\n //Add the marker position to the annotation.\r\n annotationToAdd.MarkerLocation = new DataModel.RectPositionDM(new DataModel.PositionDM(workingX, workingY), new DataModel.PositionDM(workingX + widthSetTo, workingY + 20));\r\n }\r\n\r\n /**\r\n * Draws and highlights an annotation on the annotation canvas.\r\n * @param annotation - The annotation to highlight.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private drawAddHighlighting(annotation: DataModel.AnnotationDM, imgAnnClass: HicomImageAnnotation) {\r\n\r\n if (annotation.AnnotationMarkerType == AnnotationMarkerTypeEnum.Point) {\r\n imgAnnClass.drawSinglePoint(imgAnnClass, annotation.MarkedPositions[0], true);\r\n } else if (annotation.AnnotationMarkerType == AnnotationMarkerTypeEnum.Arrow) {\r\n imgAnnClass.drawArrow(imgAnnClass, annotation.MarkedPositions[0], annotation.MarkedPositions[annotation.MarkedPositions.length - 1], true);\r\n } else if (annotation.AnnotationMarkerType == AnnotationMarkerTypeEnum.Poly) {\r\n let polyPath: Path2D = new Path2D();\r\n polyPath.moveTo(annotation.MarkedPositions[0].X, annotation.MarkedPositions[0].Y);\r\n\r\n for (var i = 0; i < annotation.MarkedPositions.length; i++) {\r\n polyPath.lineTo(annotation.MarkedPositions[i].X, annotation.MarkedPositions[i].Y);\r\n }\r\n\r\n imgAnnClass.AnnotationContext.fillStyle = imgAnnClass.MarkerHighlightFillColour;\r\n imgAnnClass.AnnotationContext.fill(polyPath);\r\n\r\n } else if (annotation.AnnotationMarkerType == AnnotationMarkerTypeEnum.Freehand) {\r\n let fhPath: Path2D = new Path2D();\r\n fhPath.moveTo(annotation.MarkedPositions[0].X, annotation.MarkedPositions[0].Y);\r\n\r\n for (var i = 0; i < annotation.MarkedPositions.length; i++) {\r\n fhPath.lineTo(annotation.MarkedPositions[i].X, annotation.MarkedPositions[i].Y);\r\n }\r\n\r\n imgAnnClass.AnnotationContext.fillStyle = imgAnnClass.MarkerHighlightFillColour;\r\n imgAnnClass.AnnotationContext.fill(fhPath);\r\n\r\n } else if (annotation.AnnotationMarkerType == AnnotationMarkerTypeEnum.Circle) {\r\n imgAnnClass.drawCricle(imgAnnClass, annotation.MarkedPositions[0], annotation.MarkedPositions[annotation.MarkedPositions.length - 1], true);\r\n\r\n } else {\r\n throw new DOMException(\"Missing AnnotationMarkerType\");\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n /**\r\n * Gets the mouse position from a PointerEvent.\r\n * @param canvas - The canvas element.\r\n * @param evt - The PointerEvent.\r\n * @returns The mouse position as a DataModel.PositionDM object.\r\n */\r\n private getMousePosPointerEvent(canvas: HTMLCanvasElement, evt: PointerEvent): DataModel.PositionDM {\r\n var rect = canvas.getBoundingClientRect(), // abs. size of element\r\n scaleX = canvas.width / rect.width, // relationship bitmap vs. element for x\r\n scaleY = canvas.height / rect.height; // relationship bitmap vs. element for y\r\n\r\n // X = scale mouse coordinates after they have\r\n // Y = been adjusted to be relative to element\r\n return new DataModel.PositionDM((evt.clientX - rect.left) * scaleX, (evt.clientY - rect.top) * scaleY);\r\n }\r\n\r\n /**\r\n * Gets the mouse position from a MouseEvent.\r\n * @param canvas - The canvas element.\r\n * @param evt - The MouseEvent.\r\n * @returns The mouse position as a DataModel.PositionDM object.\r\n */\r\n private getMousePosMouseEvent(canvas: HTMLCanvasElement, evt: MouseEvent): DataModel.PositionDM {\r\n var rect = canvas.getBoundingClientRect(), // abs. size of element\r\n scaleX = canvas.width / rect.width, // relationship bitmap vs. element for x\r\n scaleY = canvas.height / rect.height; // relationship bitmap vs. element for y\r\n\r\n // X = scale mouse coordinates after they have\r\n // Y = been adjusted to be relative to element\r\n return new DataModel.PositionDM((evt.clientX - rect.left) * scaleX, (evt.clientY - rect.top) * scaleY);\r\n }\r\n\r\n /**\r\n * Calculates the distance between two points.\r\n * @param startPoint - The starting point.\r\n * @param endPoint - The ending point.\r\n * @returns The distance between the points.\r\n */\r\n private lineDistance(startPoint: DataModel.PositionDM, endPoint: DataModel.PositionDM): number {\r\n let xs: number = 0;\r\n let ys: number = 0;\r\n\r\n xs = endPoint.X - startPoint.X;\r\n xs = xs * xs;\r\n\r\n ys = endPoint.Y - startPoint.Y;\r\n ys = ys * ys;\r\n\r\n return Math.sqrt(xs + ys);\r\n }\r\n\r\n /**\r\n * Redraws all annotations on the canvas.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private redrawAll(imgAnnClass: HicomImageAnnotation) {\r\n\r\n // \"clear\" the entire thing (actually set it to transparent black), remember the canvas is just a load of pixels, rather than controls.\r\n imgAnnClass.AnnotationContext.clearRect(0, 0, imgAnnClass.AnnotationCanvasCtrl.width, imgAnnClass.AnnotationCanvasCtrl.height);\r\n\r\n let img = new Image();\r\n img.onload = function () {\r\n\r\n //Redraw points.\r\n for (let item of imgAnnClass.AllAnnotations.Annotations) {\r\n if (item.AnnotationMarkerType === AnnotationMarkerTypeEnum.Point) {\r\n imgAnnClass.drawSinglePoint(imgAnnClass, item.MarkedPositions[0]);\r\n\r\n imgAnnClass.drawAnnotationMarker(imgAnnClass, item, item.MarkedPositions[0]);\r\n }\r\n }\r\n\r\n //Redraw arrows\r\n for (let item of imgAnnClass.AllAnnotations.Annotations) {\r\n if (item.AnnotationMarkerType === AnnotationMarkerTypeEnum.Arrow) {\r\n imgAnnClass.drawArrow(imgAnnClass, item.MarkedPositions[0], item.MarkedPositions[item.MarkedPositions.length - 1]);\r\n\r\n imgAnnClass.drawAnnotationMarker(imgAnnClass, item, item.MarkedPositions[item.MarkedPositions.length - 1]);\r\n }\r\n }\r\n\r\n //Redraw Poly\r\n for (let item of imgAnnClass.AllAnnotations.Annotations) {\r\n if (item.AnnotationMarkerType === AnnotationMarkerTypeEnum.Poly) {\r\n\r\n let firstOccured: boolean = false;\r\n\r\n for (var i = 0; i < item.MarkedPositions.length; i++) {\r\n imgAnnClass.drawSinglePoint(imgAnnClass, item.MarkedPositions[i]);\r\n\r\n if (firstOccured) {\r\n imgAnnClass.drawLine(imgAnnClass, item.MarkedPositions[i - 1], item.MarkedPositions[i]);\r\n }\r\n\r\n firstOccured = true;\r\n }\r\n\r\n imgAnnClass.drawAnnotationMarker(imgAnnClass, item, item.MarkedPositions[0]);\r\n }\r\n }\r\n\r\n //Redraw Freehand\r\n for (let item of imgAnnClass.AllAnnotations.Annotations) {\r\n if (item.AnnotationMarkerType === AnnotationMarkerTypeEnum.Freehand) {\r\n\r\n let firstOccured: boolean = false;\r\n\r\n for (var i = 0; i < item.MarkedPositions.length; i++) {\r\n if (firstOccured) {\r\n imgAnnClass.drawLine(imgAnnClass, item.MarkedPositions[i - 1], item.MarkedPositions[i]);\r\n }\r\n\r\n firstOccured = true;\r\n }\r\n\r\n imgAnnClass.drawLine(imgAnnClass, item.MarkedPositions[0], item.MarkedPositions[item.MarkedPositions.length - 1])\r\n\r\n imgAnnClass.drawAnnotationMarker(imgAnnClass, item, item.MarkedPositions[0]);\r\n }\r\n }\r\n\r\n //Redraw Circle\r\n for (let item of imgAnnClass.AllAnnotations.Annotations) {\r\n if (item.AnnotationMarkerType === AnnotationMarkerTypeEnum.Circle) {\r\n imgAnnClass.drawCricle(imgAnnClass, item.MarkedPositions[0], item.MarkedPositions[item.MarkedPositions.length - 1]);\r\n\r\n imgAnnClass.drawAnnotationMarker(imgAnnClass, item, item.MarkedPositions[0]);\r\n }\r\n }\r\n\r\n\r\n const event = new Event(\"redrawCompleted\");\r\n\r\n //This event is used in the external method which generates HTML output\r\n imgAnnClass.AnnotationCanvasCtrl.dispatchEvent(event);\r\n\r\n imgAnnClass.AnnotationCanvasCtrl.setAttribute(\"data-inital-load-complete\", \"true\");\r\n };\r\n\r\n img.src = imgAnnClass.ImgSrc;\r\n }\r\n\r\n /**\r\n * Resets the HicomImageAnnotation instance.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param redrawNeeded - Indicates if a redraw is needed.\r\n */\r\n private resetImgAnnClass(imgAnnClass: HicomImageAnnotation,\r\n redrawNeeded: boolean = false) {\r\n imgAnnClass.CurrentPathPoints = new Array();\r\n imgAnnClass.IsDrawing = false;\r\n imgAnnClass.InflightPathPoint = null;\r\n imgAnnClass.PreviousPathPoint = null;\r\n\r\n if (redrawNeeded) {\r\n imgAnnClass.redrawAll(imgAnnClass);\r\n }\r\n }\r\n\r\n /**\r\n * Sets up a Kendo UI dialog for annotations.\r\n * @param actionOK - The function to execute on OK.\r\n * @param actionCancel - The function to execute on Cancel.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param shortText - The short text for the dialog.\r\n * @param longText - The long text for the dialog.\r\n * @returns The Kendo UI dialog instance.\r\n */\r\n private setupKendoAnnotationDialog(actionOK: Function, actionCancel: Function, imgAnnClass: HicomImageAnnotation, shortText: string = \"\", longText: string = \"\"): any {\r\n var dialog = $(`
`).kendoDialog({\r\n width: \"400px\",\r\n visible: false,\r\n title: \"Annotation\",\r\n closable: true,\r\n modal: true,\r\n actions: [\r\n { text: 'Cancel', action: actionCancel },\r\n { text: 'OK', primary: true, action: actionOK }\r\n ]\r\n });\r\n\r\n if (imgAnnClass.AnnotationsDisplayMode == AnnotationsDisplayModeEnum.OutsideImageInListOnly) {\r\n //Single annotation only\r\n $(dialog).data(\"kendoDialog\").content(`\r\n
\r\n \r\n
`);\r\n }\r\n else if (imgAnnClass.AnnotationsDisplayMode == AnnotationsDisplayModeEnum.HoverShortTextAndInOutsideList) {\r\n //Two text boxes for short and long annotations.\r\n $(dialog).data(\"kendoDialog\").content(`
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
`);\r\n }\r\n\r\n return dialog;\r\n }\r\n\r\n /**\r\n * Draws an annotation marker on the canvas.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param annotationToAdd - The annotation to add.\r\n * @param annotationMarkPoint - The position of the annotation marker.\r\n */\r\n private addAllAnnotationsToList(imgAnnClass: HicomImageAnnotation) {\r\n let olAnnoLst: HTMLOListElement = document.getElementById(`olAnnotationList_${imgAnnClass.CtrlOutterId}`);\r\n\r\n for (let item of imgAnnClass.AllAnnotations.Annotations) {\r\n olAnnoLst.appendChild(this.createAnnotationListItem(item, imgAnnClass));\r\n }\r\n }\r\n\r\n /**\r\n * Adds the last annotation to the list.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private addLastAnnotationToList(imgAnnClass: HicomImageAnnotation) {\r\n let olAnnoLst: HTMLOListElement = document.getElementById(`olAnnotationList_${imgAnnClass.CtrlOutterId}`);\r\n\r\n olAnnoLst.appendChild(this.createAnnotationListItem(imgAnnClass.AllAnnotations.Annotations[imgAnnClass.AllAnnotations.Annotations.length - 1], imgAnnClass));\r\n }\r\n\r\n /**\r\n * Creates an annotation list item.\r\n * @param annotation - The annotation data model.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @returns The created HTML list item element.\r\n */\r\n private createAnnotationListItem(annotation: DataModel.AnnotationDM, imgAnnClass: HicomImageAnnotation): HTMLLIElement {\r\n let li: HTMLLIElement = document.createElement(\"li\");\r\n\r\n if (imgAnnClass.ReadOnlyMode == false) {\r\n let editSpanIcon: HTMLSpanElement = document.createElement(\"a\");\r\n editSpanIcon.className = \"icon-edit edit icon-only\";\r\n editSpanIcon.setAttribute(\"href\", \"#\");\r\n\r\n let deleteSpanIcon: HTMLSpanElement = document.createElement(\"a\");\r\n deleteSpanIcon.className = \"icon-delete delete icon-only\";\r\n deleteSpanIcon.setAttribute(\"href\", \"#\");\r\n\r\n li.appendChild(editSpanIcon);\r\n li.appendChild(deleteSpanIcon);\r\n }\r\n\r\n let annotationText: HTMLDivElement = document.createElement(\"div\");\r\n annotationText.className = \"annotation-text\";\r\n if (annotation.AnnotationLongDesc.length == 0) {\r\n annotationText.innerHTML = annotationText.innerHTML;\r\n }\r\n else {\r\n annotationText.innerHTML = annotationText.innerHTML + `${annotation.AnnotationLongDesc}`;\r\n }\r\n\r\n li.appendChild(annotationText);\r\n\r\n let redrawNeeded: boolean = true;\r\n\r\n let curriedMouseDownTouchStartHighlight = function (e: UIEvent) {\r\n\r\n let li: HTMLLIElement = e.currentTarget;\r\n\r\n if ((e.target).classList.contains(\"icon-edit\")) {\r\n let annotationDialogue = imgAnnClass.setupKendoAnnotationDialog(function (e) {\r\n\r\n let { shortText, longText }: { shortText: string; longText: string; } = imgAnnClass.getShortAndLongTextFromDialog(imgAnnClass);\r\n\r\n annotation.AnnotationShortDesc = shortText;\r\n annotation.AnnotationLongDesc = longText;\r\n\r\n let olAnnoLst: HTMLOListElement = document.getElementById(`olAnnotationList_${imgAnnClass.CtrlOutterId}`);\r\n\r\n while (olAnnoLst.firstChild) {\r\n olAnnoLst.firstChild.remove();\r\n }\r\n\r\n imgAnnClass.addAllAnnotationsToList(imgAnnClass);\r\n\r\n //Reset the annotation numbers.\r\n for (var i = 0; i < imgAnnClass.AllAnnotations.Annotations.length; i++) {\r\n imgAnnClass.AllAnnotations.Annotations[i].AnnotationNumber = i + 1;\r\n imgAnnClass.CurrentAnnotationNumber = i + 1;\r\n }\r\n\r\n imgAnnClass.updateHdnJsonAndSetDirty(imgAnnClass);\r\n imgAnnClass.resetImgAnnClass(imgAnnClass, true);\r\n\r\n li.classList.remove(\"active\");\r\n\r\n e.sender.close();\r\n e.sender.destroy();\r\n }, function (e) {\r\n li.classList.remove(\"active\");\r\n e.sender.close();\r\n e.sender.destroy();\r\n }, imgAnnClass, annotation.AnnotationShortDesc, annotation.AnnotationLongDesc);\r\n\r\n $(annotationDialogue).data(\"kendoDialog\").open();\r\n redrawNeeded = false;\r\n }\r\n else if ((e.target).classList.contains(\"icon-delete\")) {\r\n\r\n var dialog = $(`
`).kendoDialog({\r\n width: \"400px\",\r\n visible: false,\r\n title: imgAnnClass.ResxRemoveAnnotationTitle,\r\n closable: true,\r\n modal: true,\r\n content: imgAnnClass.ResxRemoveAnnotationContent,\r\n actions: [\r\n {\r\n text: 'Cancel', action: function (e) {\r\n li.classList.remove(\"active\");\r\n e.sender.close();\r\n e.sender.destroy();\r\n }\r\n }\r\n , {\r\n //@ts-ignore\r\n text: 'Delete', cssClass: \"btn btn-danger\", primary: true, action: function (e) {\r\n imgAnnClass.AllAnnotations.Annotations.splice(imgAnnClass.AllAnnotations.Annotations.findIndex(item => item.AnnotationNumber === annotation.AnnotationNumber), 1)\r\n\r\n //Remove and re add all annotations from the list.\r\n let olAnnoLst: HTMLOListElement = document.getElementById(`olAnnotationList_${imgAnnClass.CtrlOutterId}`);\r\n\r\n while (olAnnoLst.firstChild) {\r\n olAnnoLst.firstChild.remove();\r\n }\r\n\r\n imgAnnClass.addAllAnnotationsToList(imgAnnClass);\r\n\r\n //Reset the annotation numbers.\r\n for (var i = 0; i < imgAnnClass.AllAnnotations.Annotations.length; i++) {\r\n imgAnnClass.AllAnnotations.Annotations[i].AnnotationNumber = i + 1;\r\n imgAnnClass.CurrentAnnotationNumber = i + 1;\r\n }\r\n\r\n imgAnnClass.updateHdnJsonAndSetDirty(imgAnnClass);\r\n imgAnnClass.resetImgAnnClass(imgAnnClass, true);\r\n\r\n li.classList.remove(\"active\");\r\n e.sender.close();\r\n e.sender.destroy();\r\n }\r\n }\r\n ]\r\n });\r\n\r\n $(dialog).data(\"kendoDialog\").open();\r\n redrawNeeded = false;\r\n }\r\n else {\r\n imgAnnClass.drawAddHighlighting(annotation, imgAnnClass);\r\n redrawNeeded = true;\r\n }\r\n\r\n li.classList.add(\"active\");\r\n }\r\n\r\n let curriedMouseUpTouchEndHighlight = function (e: UIEvent) {\r\n if (redrawNeeded) {\r\n imgAnnClass.redrawAll(imgAnnClass);\r\n }\r\n\r\n let li: HTMLLIElement = e.currentTarget;\r\n li.classList.remove(\"active\");\r\n }\r\n\r\n if (imgAnnClass.InTouchMode) {\r\n li.removeEventListener(\"touchstart\", curriedMouseDownTouchStartHighlight);\r\n li.removeEventListener(\"touchend\", curriedMouseUpTouchEndHighlight);\r\n\r\n li.addEventListener(\"touchstart\", curriedMouseDownTouchStartHighlight);\r\n li.addEventListener(\"touchend\", curriedMouseUpTouchEndHighlight);\r\n }\r\n else {\r\n li.removeEventListener(\"mousedown\", curriedMouseDownTouchStartHighlight);\r\n li.removeEventListener(\"mouseup\", curriedMouseUpTouchEndHighlight);\r\n\r\n li.addEventListener(\"mousedown\", curriedMouseDownTouchStartHighlight);\r\n li.addEventListener(\"mouseup\", curriedMouseUpTouchEndHighlight);\r\n }\r\n\r\n return li;\r\n }\r\n\r\n /**\r\n * Sets the annotation list item as active.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param annoToCheck - The annotation data model to check.\r\n */\r\n private setAnnotationLiActive(imgAnnClass: HicomImageAnnotation, annoToCheck: DataModel.AnnotationDM) {\r\n let olAnnoLst: HTMLOListElement = document.getElementById(`olAnnotationList_${imgAnnClass.CtrlOutterId}`);\r\n\r\n for (let item of imgAnnClass.AllAnnotations.Annotations) {\r\n for (var i = 0; i < olAnnoLst.children.length; i++) {\r\n if (annoToCheck.AnnotationNumber == (i + 1)) {\r\n olAnnoLst.children[i].classList.add(\"active\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Removes the active class from all annotation list items.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private removeActiveFromAnnotationList(imgAnnClass: HicomImageAnnotation) {\r\n let olAnnoLst: HTMLOListElement = document.getElementById(`olAnnotationList_${imgAnnClass.CtrlOutterId}`);\r\n\r\n for (var i = 0; i < olAnnoLst.children.length; i++) {\r\n olAnnoLst.children[i].classList.remove(\"active\");\r\n }\r\n }\r\n\r\n /**\r\n * Removes all the annotations from the list\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private removeAllAnnotationsFromList(imgAnnClass: HicomImageAnnotation) {\r\n let olAnnoLst: HTMLOListElement = document.getElementById(`olAnnotationList_${imgAnnClass.CtrlOutterId}`);\r\n\r\n for (var i = 0; i < olAnnoLst.children.length; i++) {\r\n olAnnoLst.children[i].remove();\r\n }\r\n }\r\n\r\n /**\r\n * Handles the OK action for the annotation dialog.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @param markerType - The type of marker.\r\n * @param e - The event object.\r\n */\r\n private annotationOkayFunction(imgAnnClass: HicomImageAnnotation, markerType: AnnotationMarkerTypeEnum, e: any) {\r\n imgAnnClass.CurrentAnnotationNumber++;\r\n\r\n let { shortText, longText }: { shortText: string; longText: string; } = imgAnnClass.getShortAndLongTextFromDialog(imgAnnClass);\r\n\r\n imgAnnClass.AllAnnotations.Annotations.push(\r\n new DataModel.AnnotationDM(\r\n imgAnnClass.CurrentAnnotationNumber,\r\n shortText,\r\n longText,\r\n imgAnnClass.CurrentPathPoints,\r\n markerType\r\n )\r\n );\r\n\r\n imgAnnClass.addLastAnnotationToList(imgAnnClass);\r\n\r\n imgAnnClass.updateHdnJsonAndSetDirty(imgAnnClass);\r\n\r\n e.sender.close();\r\n e.sender.destroy();\r\n }\r\n\r\n /**\r\n * Updates the hidden JSON field and sets the form as dirty.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n */\r\n private updateHdnJsonAndSetDirty(imgAnnClass: HicomImageAnnotation) {\r\n let hdnImgAnnoJsonHoler: HTMLInputElement = document.getElementById(`${imgAnnClass.HiddenAnnoJsonHolder}${imgAnnClass.CtrlOutterId}`);\r\n\r\n //Add the annotations to the hidden field, this is what is saved to the DB\r\n hdnImgAnnoJsonHoler.value = JSON.stringify(imgAnnClass.AllAnnotations);\r\n\r\n let closestForm = $(imgAnnClass.AnnotationCanvasCtrl).closest('form')[0];\r\n\r\n if (closestForm) {\r\n let hicomFormCtrl: HicomForm = new HicomForm(closestForm.id);\r\n\r\n hicomFormCtrl.SetDirty();\r\n\r\n HicomDirtyForms.setDirtyStatus($(hdnImgAnnoJsonHoler), hdnImgAnnoJsonHoler.value);\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves the short and long text from the annotation dialog.\r\n * @param imgAnnClass - The instance of HicomImageAnnotation.\r\n * @returns An object containing the short and long text.\r\n */\r\n private getShortAndLongTextFromDialog(imgAnnClass: HicomImageAnnotation) {\r\n let shortText: string = \"\";\r\n let longText: string = \"\";\r\n\r\n if (imgAnnClass.AnnotationsDisplayMode == AnnotationsDisplayModeEnum.HoverShortTextAndInOutsideList) {\r\n let shortAnnoTextBox: HTMLInputElement = document.getElementById(`txtAnnotationShortText_${imgAnnClass.CtrlOutterId}`);\r\n shortText = shortAnnoTextBox.value;\r\n }\r\n\r\n let longAnnoTextBox: HTMLTextAreaElement = document.getElementById(`txtAnnotationLongText_${imgAnnClass.CtrlOutterId}`);\r\n\r\n longText = longAnnoTextBox.value;\r\n return { shortText, longText };\r\n }\r\n\r\n //#endregion\r\n\r\n //#region External helpers\r\n\r\n /**\r\n * This method will return a printable HTML string for the passed in Canvas ID's.\r\n * @param mainDivID The main div ID of the image annotation control.\r\n * @param canvasImageId The canvas image ID of the image annotation control.\r\n * @param canvasAnnotationId The canvas annotation ID of the image annotation control.\r\n * @param callBackFunctionAfterOnLoadOfImage The callback function to execute after the image has loaded.\r\n */\r\n public static getPrintableHtmlForImgAnnotationCtrl(mainDivID: string, canvasImageId: string, canvasAnnotationId, callBackFunctionAfterOnLoadOfImage: Function) {\r\n let canvasAnnotation: HTMLCanvasElement = document.getElementById(canvasAnnotationId);\r\n\r\n if (canvasAnnotation.dataset.initalLoadComplete && canvasAnnotation.dataset.initalLoadComplete.toLowerCase() === 'true') {\r\n HicomImageAnnotation.internalsForGettingPrintableHTML(mainDivID, canvasImageId, canvasAnnotationId, callBackFunctionAfterOnLoadOfImage);\r\n }\r\n else {\r\n let redrawCompletedFunc = function (e) {\r\n HicomImageAnnotation.internalsForGettingPrintableHTML(mainDivID, canvasImageId, canvasAnnotationId, callBackFunctionAfterOnLoadOfImage);\r\n\r\n canvasAnnotation.removeEventListener(\"redrawCompleted\", redrawCompletedFunc);\r\n }\r\n\r\n canvasAnnotation.addEventListener(\"redrawCompleted\", redrawCompletedFunc);\r\n }\r\n }\r\n\r\n /** A internal method for getting the HTML from the image annotation tool\r\n * @param mainDivID The main div ID of the image annotation control.\r\n * @param canvasImageId The canvas image ID of the image annotation control.\r\n * @param canvasAnnotationId The canvas annotation ID of the image annotation control.\r\n * @param callBackFunctionAfterOnLoadOfImage The callback function to execute after the image has loaded.\r\n */\r\n private static internalsForGettingPrintableHTML(mainDivID: string, canvasImageId: string, canvasAnnotationId, callBackFunctionAfterOnLoadOfImage: Function) {\r\n\r\n let mainDiv: HTMLDivElement = document.getElementById(mainDivID);\r\n let canvasImage: HTMLCanvasElement = document.getElementById(canvasImageId);\r\n let canvasAnnotation: HTMLCanvasElement = document.getElementById(canvasAnnotationId);\r\n\r\n let combineCanvas: HTMLCanvasElement = document.createElement(\"canvas\");\r\n combineCanvas.id = \"CombineCanvas\";\r\n combineCanvas.height = canvasAnnotation.height;\r\n combineCanvas.width = canvasAnnotation.width;\r\n\r\n let ctx: CanvasRenderingContext2D = combineCanvas.getContext(\"2d\");\r\n\r\n ctx.drawImage(canvasImage, 0, 0, canvasImage.width, canvasImage.height, // source rectangle\r\n 0, 0, canvasImage.width, canvasImage.height); // destination rectangle\r\n\r\n ctx.drawImage(canvasAnnotation, 0, 0, canvasAnnotation.width, canvasAnnotation.height, // source rectangle\r\n 0, 0, canvasAnnotation.width, canvasAnnotation.height); // destination rectangle\r\n\r\n let data: string = combineCanvas.toDataURL(\"image/png\");\r\n\r\n let clonedDiv: HTMLDivElement = mainDiv.cloneNode(true);\r\n\r\n clonedDiv.querySelector(\"script\").remove();\r\n clonedDiv.querySelector('input[type=\"hidden\"]').remove();\r\n clonedDiv.querySelector('.image-annotation-tools').remove();\r\n\r\n let canvasImg: HTMLImageElement = new Image();\r\n canvasImg.src = data;\r\n\r\n //Parent of the canvas is the holder, parent of that is the col which is where we want to put the new image.\r\n let divCol: HTMLDivElement = clonedDiv.querySelector('canvas').parentElement.parentElement;\r\n\r\n divCol.removeChild(divCol.firstChild);\r\n\r\n divCol.appendChild(canvasImg);\r\n\r\n canvasImg.onload = function () {\r\n return callBackFunctionAfterOnLoadOfImage(clonedDiv.outerHTML);\r\n }\r\n }\r\n\r\n /**\r\n * The kendo control on a published form will call this method to load the image annotation control, this method works by getting the \r\n * @param e The event passed in from the kendo control. \r\n */\r\n public static KendoUploaderDeferredLoadImageAnnotationTool(e: any) {\r\n if (e.response) {\r\n let successDM: DataModel.ImageUserUploadSuccessDM = e.response;\r\n\r\n HicomImageAnnotation.InitDeferredImgAnno(successDM.HiddenImgAnnoDetailsID, successDM.ImageBase64Src);\r\n\r\n let divUploaderCtrlHolder: HTMLDivElement = document.getElementById(`divUploaderCtrlHolder_${successDM.ImgAnnoCtrlID}`);\r\n\r\n divUploaderCtrlHolder.style.display = \"none\";\r\n\r\n let divImageAnnoCtrlHolder: HTMLDivElement = document.getElementById(`divImageAnnoCtrlHolder_${successDM.ImgAnnoCtrlID}`);\r\n\r\n divImageAnnoCtrlHolder.style.display = \"block\";\r\n\r\n let hdnRespInfoStreamId: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadStreamId_${successDM.FormFieldId}`);\r\n let hdnRespInfoUploadedDate: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadUploadedDate_${successDM.FormFieldId}`);\r\n let hdnRespInfoUploadedBy: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadUploadedBy_${successDM.FormFieldId}`);\r\n let hdnRespInfoFileName: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadFileName_${successDM.FormFieldId}`);\r\n let hdnRespInfoFileValueObjectId: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadFileValueObjectId_${successDM.FormFieldId}`);\r\n let hdnimageAnnotationUserFileUploadStatus: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadStatus_${successDM.FormFieldId}`);\r\n\r\n hdnRespInfoStreamId.value = successDM.StreamId;\r\n hdnRespInfoUploadedDate.value = new Date().toJSON();\r\n hdnRespInfoUploadedBy.value = successDM.UploadedBy.toString();\r\n hdnRespInfoFileName.value = successDM.FileName;\r\n hdnRespInfoFileValueObjectId.value = successDM.FileValueObjectId;\r\n hdnimageAnnotationUserFileUploadStatus.value = successDM.Status.toString();\r\n }\r\n }\r\n\r\n /**\r\n * Call this method when Deferred = true. This will load the information in the hidden field made that was made during the tag helper construction, and use it to initialize the image annotation tool.\r\n * @param HiddenImgAnnoDetailsID The ID of the hidden input tag which holds all the info for setting up a image annotation control.\r\n * @param ImageBase64Src The image that will be used.\r\n */\r\n public static InitDeferredImgAnno(HiddenImgAnnoDetailsID: string, ImageBase64Src: string) {\r\n let hiddenInput: HTMLInputElement = document.getElementById(HiddenImgAnnoDetailsID);\r\n\r\n if (!hiddenInput) {\r\n console.error(`Hidden input with ID ${HiddenImgAnnoDetailsID} not found.`);\r\n return;\r\n }\r\n\r\n // Deserialize the JSON data\r\n let deferredData = JSON.parse(hiddenInput.value);\r\n\r\n // Instantiate a new HicomImageAnnotation\r\n let imgAnno = new HicomImageAnnotation(\r\n deferredData.Id,\r\n deferredData.MarkerLineThickness,\r\n deferredData.MarkerLineColour,\r\n deferredData.MarkerFillColour,\r\n deferredData.MarkerHighlightLineColour,\r\n deferredData.MarkerHighlightFillColour,\r\n deferredData.AnnotationMarkerColour,\r\n deferredData.AnnotationTextColour,\r\n deferredData.AnnotationsDisplayMode,\r\n deferredData.ReadOnlyMode,\r\n deferredData.RemoveAnnotationTitle,\r\n deferredData.RemoveAnnotation,\r\n deferredData.AnnotationListLocation,\r\n deferredData.MarkerType,\r\n deferredData.ForceImageHeight,\r\n deferredData.ForceImageWidth,\r\n deferredData.CanvasImagePartialID,\r\n deferredData.CanvasAnnotationPartialID,\r\n deferredData.HiddenAnnoJsonHolder\r\n );\r\n\r\n // Call the InitImgAnnoCanvas method\r\n imgAnno.InitImgAnnoCanvas(ImageBase64Src);\r\n }\r\n\r\n /**\r\n * Call this method when Deferred = true. This will load the information in the hidden field made that was made during the tag helper construction, and use it to initialize the image annotation tool.\r\n * This method will get the image using the stream ID provided.\r\n * @param HiddenImgAnnoDetailsID The ID of the hidden input tag which holds all the info for setting up a image annotation control.\r\n * @param GetBase64ImageByStreamIDUrl The URL used to get the base 64 version of the image by stream ID.\r\n */\r\n public static InitDeferredImgAnnoStreamID(HiddenImgAnnoDetailsID: string, GetBase64ImageByStreamIDUrl: string) {\r\n let reqVerificationToken: string = $('input:hidden[name=\"__RequestVerificationToken\"]').val().toString();\r\n\r\n fetch(GetBase64ImageByStreamIDUrl, {\r\n method: 'GET',\r\n headers: {\r\n 'RequestVerificationToken': reqVerificationToken\r\n }\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n let hiddenInput: HTMLInputElement = document.getElementById(HiddenImgAnnoDetailsID);\r\n\r\n if (!hiddenInput) {\r\n console.error(`Hidden input with ID ${HiddenImgAnnoDetailsID} not found.`);\r\n return;\r\n }\r\n\r\n // Deserialize the JSON data\r\n let deferredData = JSON.parse(hiddenInput.value);\r\n\r\n // Instantiate a new HicomImageAnnotation\r\n let imgAnno = new HicomImageAnnotation(\r\n deferredData.Id,\r\n deferredData.MarkerLineThickness,\r\n deferredData.MarkerLineColour,\r\n deferredData.MarkerFillColour,\r\n deferredData.MarkerHighlightLineColour,\r\n deferredData.MarkerHighlightFillColour,\r\n deferredData.AnnotationMarkerColour,\r\n deferredData.AnnotationTextColour,\r\n deferredData.AnnotationsDisplayMode,\r\n deferredData.ReadOnlyMode,\r\n deferredData.RemoveAnnotationTitle,\r\n deferredData.RemoveAnnotation,\r\n deferredData.AnnotationListLocation,\r\n deferredData.MarkerType,\r\n deferredData.ForceImageHeight,\r\n deferredData.ForceImageWidth,\r\n deferredData.CanvasImagePartialID,\r\n deferredData.CanvasAnnotationPartialID,\r\n deferredData.HiddenAnnoJsonHolder\r\n );\r\n\r\n // Call the InitImgAnnoCanvas method\r\n imgAnno.InitImgAnnoCanvas(data.base64String);\r\n })\r\n .catch(error => console.error('Error fetching image:', error));\r\n }\r\n\r\n /**\r\n * Clone the image annotation tool and replace, this is done to remove any floating events that have been registered on previous deferred uploads.\r\n * @param imageAnnotationHolderID the image annotation tool holder ID.\r\n */\r\n public static cloneAndReplaceImageAnnotationTool(imageAnnotationHolderID: string) {\r\n let imgAnnoHolder: HTMLElement = document.getElementById(imageAnnotationHolderID);\r\n\r\n if (imgAnnoHolder) {\r\n //The below steps are done to remove any floating events that have been registered on previous deferred uploads.\r\n //Clone the image annotation tool\r\n let newImgAnnoHolder = imgAnnoHolder.cloneNode(true);\r\n\r\n //Add the new image annotation tool before the old image annotation tool.\r\n imgAnnoHolder.parentElement.insertBefore(newImgAnnoHolder, imgAnnoHolder);\r\n\r\n //Remove the old image annotation tool.\r\n imgAnnoHolder.parentElement.removeChild(imgAnnoHolder);\r\n }\r\n }\r\n\r\n /**\r\n * The kendo control on a published form, errored during the upload or remove action, this handles that error.\r\n * @param e\r\n */\r\n public static handleKendoUploadError(e: any) {\r\n // Fires when the \"upload\" or \"remove\" operation fails. The Error event fires only when the Upload is in async mode.\r\n console.log(\"Error (\" + e.operation + \")\");\r\n }\r\n\r\n /**\r\n * Handle when the image is removed from the annotation tool, this will ensure that the response Json is also updated.\r\n * @param removeUrl - The URL to send the remove request to.\r\n * @param imgAnnoContainerID - The ID of the image annotation container.\r\n * @param uploadContainerID - The ID of the upload container.\r\n * @param uploadCtrlID - The ID of the upload control.\r\n * @param formFieldId - The ID of the form field.\r\n * @param formResponseJsonId - The ID of the form response JSON.\r\n * @param formPageId - The form page ID for the request.\r\n * @param resxConfirmRemovalOfImageTitle - The title for confirming the image should be removed.\r\n * @param resxConfirmRemovalOfImageContent - The text for confirming the image should be removed.\r\n * @param hiddenAnnoJsonHolder - the hidden annotation JSON holder.\r\n */\r\n public static removeImageAnnotationImageAndShowUploadTool(\r\n removeUrl: string,\r\n imgAnnoContainerID: string,\r\n uploadContainerID: string,\r\n uploadCtrlID: string,\r\n formFieldId: string,\r\n formJsonInstanceId: string,\r\n formPageId: string,\r\n resxConfirmRemovalOfImageTitle: string,\r\n resxConfirmRemovalOfImageContent: string,\r\n hiddenAnnoJsonHolder: string\r\n ) {\r\n $(\"
\").kendoDialog({\r\n closable: false,\r\n title: resxConfirmRemovalOfImageTitle,\r\n content: resxConfirmRemovalOfImageContent,\r\n actions: [{\r\n text: \"Remove\",\r\n action: function (e) {\r\n\r\n let reqVerificationToken: string = $('input:hidden[name=\"__RequestVerificationToken\"]').val().toString();\r\n\r\n let hdnRespInfoStreamId: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadStreamId_${formFieldId}`);\r\n\r\n let formData = new FormData();\r\n formData.append('FormFieldId', formFieldId);\r\n formData.append('FormJsonInstanceId', formJsonInstanceId);\r\n formData.append('FormPageId', formPageId);\r\n formData.append('StreamId', hdnRespInfoStreamId.value);\r\n\r\n fetch(removeUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'RequestVerificationToken': reqVerificationToken\r\n },\r\n body: formData\r\n })\r\n .then(response => {\r\n\r\n if (response.ok) {\r\n\r\n // Done to remove any floating event listeners\r\n HicomImageAnnotation.cloneAndReplaceImageAnnotationTool(imgAnnoContainerID);\r\n\r\n const annotationTool = document.getElementById(imgAnnoContainerID);\r\n if (annotationTool) {\r\n annotationTool.style.display = 'none';\r\n let hdnAnnJsonHolder: HTMLInputElement = document.getElementById(`${hiddenAnnoJsonHolder}`);\r\n\r\n\r\n if (hdnAnnJsonHolder) {\r\n hdnAnnJsonHolder.value = \"\";\r\n }\r\n\r\n let hdnRespInfoStreamId: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadStreamId_${formFieldId}`);\r\n let hdnRespInfoUploadedDate: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadUploadedDate_${formFieldId}`);\r\n let hdnRespInfoUploadedBy: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadUploadedBy_${formFieldId}`);\r\n let hdnRespInfoFileName: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadFileName_${formFieldId}`);\r\n let hdnRespInfoFileValueObjectId: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadFileValueObjectId_${formFieldId}`);\r\n let hdnimageAnnotationUserFileUploadStatus: HTMLInputElement = document.getElementById(`hdnimageAnnotationUserFileUploadStatus_${formFieldId}`);\r\n\r\n hdnRespInfoStreamId.value = \"\";\r\n hdnRespInfoUploadedDate.value = \"\";\r\n hdnRespInfoUploadedBy.value = \"\";\r\n hdnRespInfoFileName.value = \"\";\r\n hdnRespInfoFileValueObjectId.value = \"\";\r\n hdnimageAnnotationUserFileUploadStatus.value = \"\";\r\n }\r\n\r\n let uploadCtrl: kendo.ui.Upload = $(`#${uploadCtrlID}`).data(\"kendoUpload\");\r\n uploadCtrl.clearAllFiles();\r\n\r\n const uploadTool = document.getElementById(uploadContainerID);\r\n if (uploadTool) {\r\n uploadTool.style.display = 'block';\r\n }\r\n\r\n } else {\r\n // Handle error\r\n console.error('Failed to remove image');\r\n }\r\n })\r\n .catch(error => {\r\n console.error('Error:', error);\r\n });\r\n },\r\n //@ts-ignore\r\n cssClass: \"btn btn-danger\"\r\n }, {\r\n text: \"Cancel\"\r\n }]\r\n }).data(\"kendoDialog\").open().center();\r\n }\r\n\r\n //#endregion\r\n }\r\n\r\n /**\r\n * The AnnotationMarkerTypeEnum enum is used to define the type of annotation marker.\r\n * PLEASE NOTE: The values must match the enum in the C# code in the ImageAnnotationControlEnums.cs file\r\n */\r\n export enum AnnotationMarkerTypeEnum {\r\n Point = 0,\r\n Arrow = 1,\r\n Poly = 2,\r\n Freehand = 3,\r\n Circle = 4\r\n }\r\n\r\n /**\r\n * The AnnotationsDisplayModeEnum enum is used to define the location where the annotations will appear.\r\n * PLEASE NOTE: The values must match the enum in the C# code in the ImageAnnotationControlEnums.cs file\r\n */\r\n export enum AnnotationsDisplayModeEnum {\r\n OutsideImageInListOnly = 0,\r\n HoverShortTextAndInOutsideList = 1\r\n }\r\n\r\n /**\r\n * The AnnotationListLocationEnum enum is used to define the location where the annotation list will appear.\r\n * PLEASE NOTE: The values must match the enum in the C# code in the ImageAnnotationControlEnums.cs file\r\n */\r\n export enum AnnotationListLocationEnum {\r\n Left = 0,\r\n Top = 1,\r\n Right = 2,\r\n Bottom = 3\r\n }\r\n}\r\n\r\nnamespace Hicom.Engine.UI.TagHelper.DataModel {\r\n\r\n /**\r\n * Represents the ImageUserUploadSuccess data model.\r\n */\r\n export class ImageUserUploadSuccessDM {\r\n\r\n /**\r\n * Indicates whether the upload was successful.\r\n */\r\n public Success: boolean;\r\n\r\n /**\r\n * The hidden control ID which holds all the details for the image annotation control.\r\n */\r\n public HiddenImgAnnoDetailsID: string;\r\n\r\n /**\r\n * The base64 encoded source of the uploaded image.\r\n */\r\n public ImageBase64Src: string;\r\n\r\n /**\r\n * The image annotation control ID.\r\n */\r\n public ImgAnnoCtrlID: string;\r\n\r\n /**\r\n * The ID of the form field associated with the image.\r\n */\r\n public FormFieldId: string;\r\n\r\n /**\r\n * The stream ID of the upload image.\r\n */\r\n public StreamId: string;\r\n\r\n /**\r\n * The name of the uploaded image.\r\n */\r\n public FileName: string;\r\n\r\n /**\r\n * The ID of the user who uploaded the image.\r\n */\r\n public UploadedBy: number;\r\n\r\n /**\r\n * The type of the uploaded image.\r\n */\r\n public FileValueObjectId: string;\r\n\r\n /**\r\n * The status of the uploaded image.\r\n */\r\n public Status: number;\r\n }\r\n\r\n /**\r\n * Represents a position with x and y coordinates.\r\n */\r\n export class PositionDM {\r\n /**\r\n * The x-coordinate of the position.\r\n */\r\n public X: number;\r\n\r\n /**\r\n * The y-coordinate of the position.\r\n */\r\n public Y: number;\r\n\r\n /**\r\n * Initializes a new instance of the PositionDM class.\r\n * @param x - The x-coordinate of the position.\r\n * @param y - The y-coordinate of the position.\r\n */\r\n constructor(x: number, y: number) {\r\n this.X = x;\r\n this.Y = y;\r\n }\r\n }\r\n\r\n /**\r\n * Represents a rectangular position with top-left and bottom-right coordinates.\r\n */\r\n export class RectPositionDM {\r\n /**\r\n * The top-left position of the rectangle.\r\n */\r\n TopLeft: PositionDM;\r\n\r\n /**\r\n * The bottom-right position of the rectangle.\r\n */\r\n BottomRight: PositionDM;\r\n\r\n /**\r\n * Initializes a new instance of the RectPositionDM class.\r\n * @param topLeft - The top-left position of the rectangle.\r\n * @param bottomRight - The bottom-right position of the rectangle.\r\n */\r\n constructor(topLeft: PositionDM, bottomRight: PositionDM) {\r\n this.TopLeft = topLeft;\r\n this.BottomRight = bottomRight;\r\n }\r\n }\r\n\r\n /**\r\n * Represents all image annotations data model.\r\n */\r\n export class AllImageAnnotationsDM {\r\n /**\r\n * The width of the image.\r\n */\r\n public ImageWidth: number;\r\n\r\n /**\r\n * The height of the image.\r\n */\r\n public ImageHeight: number;\r\n\r\n /**\r\n * The list of annotations.\r\n */\r\n public Annotations: Array;\r\n\r\n /**\r\n * Initializes a new instance of the AllImageAnnotationsDM class.\r\n */\r\n constructor() {\r\n this.Annotations = new Array();\r\n }\r\n }\r\n\r\n /**\r\n * Represents a single annotation data model.\r\n */\r\n export class AnnotationDM {\r\n /**\r\n * The number of the annotation.\r\n */\r\n public AnnotationNumber: number;\r\n\r\n /**\r\n * A short description of the annotation.\r\n */\r\n public AnnotationShortDesc: string;\r\n\r\n /**\r\n * A long description of the annotation.\r\n */\r\n public AnnotationLongDesc: string;\r\n\r\n /**\r\n * The list of positions that are marked by the annotation.\r\n */\r\n public MarkedPositions: Array;\r\n\r\n /**\r\n * The type of the annotation marker.\r\n */\r\n public AnnotationMarkerType: AnnotationMarkerTypeEnum;\r\n\r\n /**\r\n * The location of the marker.\r\n */\r\n public MarkerLocation: RectPositionDM;\r\n\r\n /**\r\n * Initializes a new instance of the AnnotationDM class.\r\n * @param annotationNumber - The unique number of the annotation.\r\n * @param annotationShortDesc - A short description of the annotation.\r\n * @param annotationLongDesc - A long description of the annotation.\r\n * @param markedPositions - The list of positions that are marked by the annotation.\r\n * @param annotationMarkerType - The type of the annotation marker.\r\n */\r\n constructor(\r\n annotationNumber: number,\r\n annotationShortDesc: string,\r\n annotationLongDesc: string,\r\n markedPositions: Array,\r\n annotationMarkerType: AnnotationMarkerTypeEnum\r\n ) {\r\n this.AnnotationNumber = annotationNumber;\r\n this.AnnotationShortDesc = annotationShortDesc;\r\n this.AnnotationLongDesc = annotationLongDesc;\r\n this.MarkedPositions = markedPositions;\r\n this.AnnotationMarkerType = annotationMarkerType;\r\n }\r\n }\r\n\r\n}"]}