diff --git a/ChangeLog b/ChangeLog
index 6024126a266c98c4c02b223fd8376714dbfa9c61..0c3598741f12c4b5ada1956effe43332ac4136e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+09-JAN-2019: 12.5.1
+
+- Fixes label offsets in viewer
+- Uses mxGraph 4.1.0 pre 2
+
 07-JAN-2019: 12.5.0
 
 - Enables reflow in HTML output
diff --git a/VERSION b/VERSION
index ba247e62f64a6882bf0e75eacfaa3ac5f2f8ee24..921241d894fe6c195adda1a8fb9432acd9b06588 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-12.5.0
\ No newline at end of file
+12.5.1
\ No newline at end of file
diff --git a/etc/mxgraph/mxClient.js b/etc/mxgraph/mxClient.js
index cd093ba4eb7d2fb7d98263baab3da4d0ea427e0b..8d7d07ddb0a5c2c55efcc16cf21e0c1edca89124 100644
--- a/etc/mxgraph/mxClient.js
+++ b/etc/mxgraph/mxClient.js
@@ -214,7 +214,7 @@ mxUndoManager.prototype.undo=function(){for(;0<this.indexOfNextAdd;){var a=this.
 mxUndoManager.prototype.redo=function(){for(var a=this.history.length;this.indexOfNextAdd<a;){var b=this.history[this.indexOfNextAdd++];b.redo();if(b.isSignificant()){this.fireEvent(new mxEventObject(mxEvent.REDO,"edit",b));break}}};mxUndoManager.prototype.undoableEditHappened=function(a){this.trim();0<this.size&&this.size==this.history.length&&this.history.shift();this.history.push(a);this.indexOfNextAdd=this.history.length;this.fireEvent(new mxEventObject(mxEvent.ADD,"edit",a))};
 mxUndoManager.prototype.trim=function(){if(this.history.length>this.indexOfNextAdd)for(var a=this.history.splice(this.indexOfNextAdd,this.history.length-this.indexOfNextAdd),b=0;b<a.length;b++)a[b].die()};var mxUrlConverter=function(){};mxUrlConverter.prototype.enabled=!0;mxUrlConverter.prototype.baseUrl=null;mxUrlConverter.prototype.baseDomain=null;
 mxUrlConverter.prototype.updateBaseUrl=function(){this.baseDomain=location.protocol+"//"+location.host;this.baseUrl=this.baseDomain+location.pathname;var a=this.baseUrl.lastIndexOf("/");0<a&&(this.baseUrl=this.baseUrl.substring(0,a+1))};mxUrlConverter.prototype.isEnabled=function(){return this.enabled};mxUrlConverter.prototype.setEnabled=function(a){this.enabled=a};mxUrlConverter.prototype.getBaseUrl=function(){return this.baseUrl};mxUrlConverter.prototype.setBaseUrl=function(a){this.baseUrl=a};
-mxUrlConverter.prototype.getBaseDomain=function(){return this.baseDomain};mxUrlConverter.prototype.setBaseDomain=function(a){this.baseDomain=a};mxUrlConverter.prototype.isRelativeUrl=function(a){return"//"!=a.substring(0,2)&&"http://"!=a.substring(0,7)&&"https://"!=a.substring(0,8)&&"data:image"!=a.substring(0,10)&&"file://"!=a.substring(0,7)};
+mxUrlConverter.prototype.getBaseDomain=function(){return this.baseDomain};mxUrlConverter.prototype.setBaseDomain=function(a){this.baseDomain=a};mxUrlConverter.prototype.isRelativeUrl=function(a){return null!=a&&"//"!=a.substring(0,2)&&"http://"!=a.substring(0,7)&&"https://"!=a.substring(0,8)&&"data:image"!=a.substring(0,10)&&"file://"!=a.substring(0,7)};
 mxUrlConverter.prototype.convert=function(a){this.isEnabled()&&this.isRelativeUrl(a)&&(null==this.getBaseUrl()&&this.updateBaseUrl(),a="/"==a.charAt(0)?this.getBaseDomain()+a:this.getBaseUrl()+a);return a};
 function mxPanningManager(a){this.thread=null;this.active=!1;this.dy=this.dx=this.t0y=this.t0x=this.tdy=this.tdx=0;this.scrollbars=!1;this.scrollTop=this.scrollLeft=0;this.mouseListener={mouseDown:function(a,b){},mouseMove:function(a,b){},mouseUp:mxUtils.bind(this,function(a,b){this.active&&this.stop()})};a.addMouseListener(this.mouseListener);this.mouseUpListener=mxUtils.bind(this,function(){this.active&&this.stop()});mxEvent.addListener(document,"mouseup",this.mouseUpListener);var b=mxUtils.bind(this,
 function(){this.scrollbars=mxUtils.hasScrollbars(a.container);this.scrollLeft=a.container.scrollLeft;this.scrollTop=a.container.scrollTop;return window.setInterval(mxUtils.bind(this,function(){this.tdx-=this.dx;this.tdy-=this.dy;this.scrollbars?(a.panGraph(-a.container.scrollLeft-Math.ceil(this.dx),-a.container.scrollTop-Math.ceil(this.dy)),a.panDx=this.scrollLeft-a.container.scrollLeft,a.panDy=this.scrollTop-a.container.scrollTop,a.fireEvent(new mxEventObject(mxEvent.PAN))):a.panGraph(this.getDx(),
@@ -328,11 +328,11 @@ b.documentElement.appendChild(c);var d=document.createElement("div");d.innerHTML
 "&amp;").replace(/<br>/g,"<br />").replace(/<hr>/g,"<hr />").replace(/(<img[^>]+)>/gm,"$1 />")}return a};
 mxSvgCanvas2D.prototype.createDiv=function(a){mxUtils.isNode(a)||(a="<div><div>"+this.convertHtml(a)+"</div></div>");if(mxClient.IS_IE||mxClient.IS_IE11||!document.createElementNS){mxUtils.isNode(a)&&(a="<div><div>"+mxUtils.getXml(a)+"</div></div>");a='<div xmlns="http://www.w3.org/1999/xhtml">'+a+"</div>";if("ActiveXObject"in window){var b=mxUtils.createMsXmlDocument();b.loadXML(a);return b.documentElement}return mxUtils.parseXml(a).documentElement}b=document.createElementNS("http://www.w3.org/1999/xhtml",
 "div");if(mxUtils.isNode(a)){var c=document.createElement("div"),d=c.cloneNode(!1);this.root.ownerDocument!=document?c.appendChild(a.cloneNode(!0)):c.appendChild(a);d.appendChild(c);b.appendChild(d)}else b.innerHTML=a;return b};mxSvgCanvas2D.prototype.updateText=function(a,b,c,d,e,f,g,k,l,m,n){null!=n&&null!=n.firstChild&&null!=n.firstChild.firstChild&&this.updateTextNodes(a,b,c,d,e,f,g,k,l,m,n.firstChild)};
-mxSvgCanvas2D.prototype.addForeignObject=function(a,b,c,d,e,f,g,k,l,m,n,p,q,r,t){q=this.createElement("foreignObject");var u=this.createElement("g");r.ownerDocument!=document&&(r=mxUtils.importNodeImplementation(q.ownerDocument,r,!0));q.appendChild(r);u.appendChild(q);this.updateTextNodes(a,b,c,d,f,g,k,m,n,p,u);this.root.ownerDocument!=document&&(a=this.createAlternateContent(q,a,b,c,d,e,f,g,k,l,m,n,p),null!=a&&(q.setAttribute("requiredFeatures","http://www.w3.org/TR/SVG11/feature#Extensibility"),
-b=this.createElement("switch"),b.appendChild(q),b.appendChild(a),u.appendChild(b)));t.appendChild(u)};
-mxSvgCanvas2D.prototype.updateTextNodes=function(a,b,c,d,e,f,g,k,l,m,n){a+=this.state.dx;b+=this.state.dy;var p=this.state.scale,q=n.firstChild,r=q.firstChild,t=r.firstChild,u=t.firstChild,x=this.getTextCss();q.setAttribute("width",Math.ceil(1/Math.min(1,p)*100)+"%");q.setAttribute("height",Math.ceil(1/Math.min(1,p)*100)+"%");q.setAttribute("style","overflow: visible;");q.setAttribute("pointer-events","none");mxSvgCanvas2D.createCss(c,d,e,f,g,k,l,null!=this.state.fontBackgroundColor?this.state.fontBackgroundColor:
-null,null!=this.state.fontBorderColor?this.state.fontBorderColor:null,"display: flex; align-items: unsafe "+(f==mxConstants.ALIGN_TOP?"flex-start":f==mxConstants.ALIGN_BOTTOM?"flex-end":"center")+"; justify-content: unsafe "+(e==mxConstants.ALIGN_LEFT?"flex-start":e==mxConstants.ALIGN_RIGHT?"flex-end":"center")+"; ",x,p,mxUtils.bind(this,function(c,d,e,f,g){r.setAttribute("style",e+"padding-left: "+Math.round(a+c)+"px; padding-top: "+Math.round(b+d)+"px;");t.setAttribute("style",f);u.setAttribute("style",
-g);c=(this.rotateHtml?this.state.rotation:0)+(null!=m?m:0);c=(0!=this.foOffset?"translate("+this.foOffset+" "+this.foOffset+") ":"")+(1!=p?"scale("+p+") ":"")+(0!=c?"rotate("+c+" "+a+" "+b+")":"");""!=c?n.setAttribute("transform",c):n.removeAttribute("transform");1!=this.state.alpha?n.setAttribute("opacity",this.state.alpha):n.removeAttribute("opacity")}))};
+mxSvgCanvas2D.prototype.addForeignObject=function(a,b,c,d,e,f,g,k,l,m,n,p,q,r,t){q=this.createElement("g");var u=this.createElement("foreignObject");u.setAttribute("style","overflow: visible; text-align: left;");u.setAttribute("pointer-events","none");r.ownerDocument!=document&&(r=mxUtils.importNodeImplementation(u.ownerDocument,r,!0));u.appendChild(r);q.appendChild(u);this.updateTextNodes(a,b,c,d,f,g,k,m,n,p,q);this.root.ownerDocument!=document&&(a=this.createAlternateContent(u,a,b,c,d,e,f,g,k,l,
+m,n,p),null!=a&&(u.setAttribute("requiredFeatures","http://www.w3.org/TR/SVG11/feature#Extensibility"),b=this.createElement("switch"),b.appendChild(u),b.appendChild(a),q.appendChild(b)));t.appendChild(q)};
+mxSvgCanvas2D.prototype.updateTextNodes=function(a,b,c,d,e,f,g,k,l,m,n){var p=this.state.scale;mxSvgCanvas2D.createCss(c,d,e,f,g,k,l,null!=this.state.fontBackgroundColor?this.state.fontBackgroundColor:null,null!=this.state.fontBorderColor?this.state.fontBorderColor:null,"display: flex; align-items: unsafe "+(f==mxConstants.ALIGN_TOP?"flex-start":f==mxConstants.ALIGN_BOTTOM?"flex-end":"center")+"; justify-content: unsafe "+(e==mxConstants.ALIGN_LEFT?"flex-start":e==mxConstants.ALIGN_RIGHT?"flex-end":
+"center")+"; ",this.getTextCss(),p,mxUtils.bind(this,function(c,d,e,f,g){a+=this.state.dx;b+=this.state.dy;var k=n.firstChild,l=k.firstChild,q=l.firstChild,r=(this.rotateHtml?this.state.rotation:0)+(null!=m?m:0),t=(0!=this.foOffset?"translate("+this.foOffset+" "+this.foOffset+")":"")+(1!=p?"scale("+p+")":"");q.firstChild.setAttribute("style",g);q.setAttribute("style",f);k.setAttribute("width",Math.ceil(1/Math.min(1,p)*100)+"%");k.setAttribute("height",Math.ceil(1/Math.min(1,p)*100)+"%");d=Math.round(b+
+d);0>d?k.setAttribute("y",d):(k.removeAttribute("y"),e+="padding-top: "+d+"px; ");l.setAttribute("style",e+"margin-left: "+Math.round(a+c)+"px;");t+=0!=r?"rotate("+r+" "+a+" "+b+")":"";""!=t?n.setAttribute("transform",t):n.removeAttribute("transform");1!=this.state.alpha?n.setAttribute("opacity",this.state.alpha):n.removeAttribute("opacity")}))};
 mxSvgCanvas2D.createCss=function(a,b,c,d,e,f,g,k,l,m,n,p,q){p="box-sizing: border-box; text-align: "+(c==mxConstants.ALIGN_LEFT?"left":c==mxConstants.ALIGN_RIGHT?"right":"center")+"; ";var r=mxUtils.getAlignmentAsPoint(c,d);c="overflow: hidden; ";d="width: 1px; ";var t="height: 1px; ",u=r.x*a,r=r.y*b;g?(d="width: "+Math.round(a)+"px; ",p+="max-height: "+Math.round(b)+"px; ",r=0):"fill"==f?(d="width: "+Math.round(a)+"px; ",t="height: "+Math.round(b)+"px; ",n+="width: 100%; height: 100%; ",p+=d+t):
 "width"==f?(d="width: "+Math.round(a)+"px; ",n+="width: 100%; ",p+=d,r=0,0<b&&(p+="max-height: "+Math.round(b)+"px; ")):(c="",r=0);b="";null!=k&&(b+="background-color: "+k+"; ");null!=l&&(b+="border: 1px solid "+l+"; ");""==c||g?n+=b:p+=b;e&&0<a?(n+="white-space: normal; word-wrap: "+mxConstants.WORD_WRAP+"; ",d="width: "+Math.round(a)+"px; ",""!=c&&"fill"!=f&&(r=0)):(n+="white-space: nowrap; ",""==c&&(u=0));q(u,r,m+d+t,p+c,n,c)};
 mxSvgCanvas2D.prototype.getTextCss=function(){var a=this.state,b="display: inline-block; font-size: "+a.fontSize+"px; font-family: "+a.fontFamily+"; color: "+a.fontColor+"; line-height: "+(mxConstants.ABSOLUTE_LINE_HEIGHT?a.fontSize*mxConstants.LINE_HEIGHT+"px":mxConstants.LINE_HEIGHT*this.lineHeightCorrection)+"; pointer-events: "+(this.pointerEvents?this.pointerEventsValue:"none")+"; ";(a.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&(b+="font-weight: bold; ");(a.fontStyle&mxConstants.FONT_ITALIC)==
diff --git a/src/main/webapp/cache.manifest b/src/main/webapp/cache.manifest
index b9e154a71d0ebc497d59b75ad5841c6c6f2d4a77..80f5248ef69bf23d0810b0ab1aab928678036188 100644
--- a/src/main/webapp/cache.manifest
+++ b/src/main/webapp/cache.manifest
@@ -1,7 +1,7 @@
 CACHE MANIFEST
 
 # THIS FILE WAS GENERATED. DO NOT MODIFY!
-# 01/07/2020 12:31 PM
+# 01/09/2020 09:53 AM
 
 app.html
 index.html?offline=1
diff --git a/src/main/webapp/js/app.min.js b/src/main/webapp/js/app.min.js
index 67582d3d195e9e45a7c385b60e1a97ec639c1913..65f1979471e0803e332e0ef06223ce59b23ae465 100644
--- a/src/main/webapp/js/app.min.js
+++ b/src/main/webapp/js/app.min.js
@@ -357,7 +357,7 @@ mxUndoManager.prototype.undo=function(){for(;0<this.indexOfNextAdd;){var a=this.
 mxUndoManager.prototype.redo=function(){for(var a=this.history.length;this.indexOfNextAdd<a;){var b=this.history[this.indexOfNextAdd++];b.redo();if(b.isSignificant()){this.fireEvent(new mxEventObject(mxEvent.REDO,"edit",b));break}}};mxUndoManager.prototype.undoableEditHappened=function(a){this.trim();0<this.size&&this.size==this.history.length&&this.history.shift();this.history.push(a);this.indexOfNextAdd=this.history.length;this.fireEvent(new mxEventObject(mxEvent.ADD,"edit",a))};
 mxUndoManager.prototype.trim=function(){if(this.history.length>this.indexOfNextAdd)for(var a=this.history.splice(this.indexOfNextAdd,this.history.length-this.indexOfNextAdd),b=0;b<a.length;b++)a[b].die()};var mxUrlConverter=function(){};mxUrlConverter.prototype.enabled=!0;mxUrlConverter.prototype.baseUrl=null;mxUrlConverter.prototype.baseDomain=null;
 mxUrlConverter.prototype.updateBaseUrl=function(){this.baseDomain=location.protocol+"//"+location.host;this.baseUrl=this.baseDomain+location.pathname;var a=this.baseUrl.lastIndexOf("/");0<a&&(this.baseUrl=this.baseUrl.substring(0,a+1))};mxUrlConverter.prototype.isEnabled=function(){return this.enabled};mxUrlConverter.prototype.setEnabled=function(a){this.enabled=a};mxUrlConverter.prototype.getBaseUrl=function(){return this.baseUrl};mxUrlConverter.prototype.setBaseUrl=function(a){this.baseUrl=a};
-mxUrlConverter.prototype.getBaseDomain=function(){return this.baseDomain};mxUrlConverter.prototype.setBaseDomain=function(a){this.baseDomain=a};mxUrlConverter.prototype.isRelativeUrl=function(a){return"//"!=a.substring(0,2)&&"http://"!=a.substring(0,7)&&"https://"!=a.substring(0,8)&&"data:image"!=a.substring(0,10)&&"file://"!=a.substring(0,7)};
+mxUrlConverter.prototype.getBaseDomain=function(){return this.baseDomain};mxUrlConverter.prototype.setBaseDomain=function(a){this.baseDomain=a};mxUrlConverter.prototype.isRelativeUrl=function(a){return null!=a&&"//"!=a.substring(0,2)&&"http://"!=a.substring(0,7)&&"https://"!=a.substring(0,8)&&"data:image"!=a.substring(0,10)&&"file://"!=a.substring(0,7)};
 mxUrlConverter.prototype.convert=function(a){this.isEnabled()&&this.isRelativeUrl(a)&&(null==this.getBaseUrl()&&this.updateBaseUrl(),a="/"==a.charAt(0)?this.getBaseDomain()+a:this.getBaseUrl()+a);return a};
 function mxPanningManager(a){this.thread=null;this.active=!1;this.dy=this.dx=this.t0y=this.t0x=this.tdy=this.tdx=0;this.scrollbars=!1;this.scrollTop=this.scrollLeft=0;this.mouseListener={mouseDown:function(a,b){},mouseMove:function(a,b){},mouseUp:mxUtils.bind(this,function(a,b){this.active&&this.stop()})};a.addMouseListener(this.mouseListener);this.mouseUpListener=mxUtils.bind(this,function(){this.active&&this.stop()});mxEvent.addListener(document,"mouseup",this.mouseUpListener);var b=mxUtils.bind(this,
 function(){this.scrollbars=mxUtils.hasScrollbars(a.container);this.scrollLeft=a.container.scrollLeft;this.scrollTop=a.container.scrollTop;return window.setInterval(mxUtils.bind(this,function(){this.tdx-=this.dx;this.tdy-=this.dy;this.scrollbars?(a.panGraph(-a.container.scrollLeft-Math.ceil(this.dx),-a.container.scrollTop-Math.ceil(this.dy)),a.panDx=this.scrollLeft-a.container.scrollLeft,a.panDy=this.scrollTop-a.container.scrollTop,a.fireEvent(new mxEventObject(mxEvent.PAN))):a.panGraph(this.getDx(),
@@ -471,11 +471,11 @@ b.documentElement.appendChild(c);var d=document.createElement("div");d.innerHTML
 "&amp;").replace(/<br>/g,"<br />").replace(/<hr>/g,"<hr />").replace(/(<img[^>]+)>/gm,"$1 />")}return a};
 mxSvgCanvas2D.prototype.createDiv=function(a){mxUtils.isNode(a)||(a="<div><div>"+this.convertHtml(a)+"</div></div>");if(mxClient.IS_IE||mxClient.IS_IE11||!document.createElementNS){mxUtils.isNode(a)&&(a="<div><div>"+mxUtils.getXml(a)+"</div></div>");a='<div xmlns="http://www.w3.org/1999/xhtml">'+a+"</div>";if("ActiveXObject"in window){var b=mxUtils.createMsXmlDocument();b.loadXML(a);return b.documentElement}return mxUtils.parseXml(a).documentElement}b=document.createElementNS("http://www.w3.org/1999/xhtml",
 "div");if(mxUtils.isNode(a)){var c=document.createElement("div"),d=c.cloneNode(!1);this.root.ownerDocument!=document?c.appendChild(a.cloneNode(!0)):c.appendChild(a);d.appendChild(c);b.appendChild(d)}else b.innerHTML=a;return b};mxSvgCanvas2D.prototype.updateText=function(a,b,c,d,e,f,g,k,l,m,n){null!=n&&null!=n.firstChild&&null!=n.firstChild.firstChild&&this.updateTextNodes(a,b,c,d,e,f,g,k,l,m,n.firstChild)};
-mxSvgCanvas2D.prototype.addForeignObject=function(a,b,c,d,e,f,g,k,l,m,n,p,q,r,t){q=this.createElement("foreignObject");var u=this.createElement("g");r.ownerDocument!=document&&(r=mxUtils.importNodeImplementation(q.ownerDocument,r,!0));q.appendChild(r);u.appendChild(q);this.updateTextNodes(a,b,c,d,f,g,k,m,n,p,u);this.root.ownerDocument!=document&&(a=this.createAlternateContent(q,a,b,c,d,e,f,g,k,l,m,n,p),null!=a&&(q.setAttribute("requiredFeatures","http://www.w3.org/TR/SVG11/feature#Extensibility"),
-b=this.createElement("switch"),b.appendChild(q),b.appendChild(a),u.appendChild(b)));t.appendChild(u)};
-mxSvgCanvas2D.prototype.updateTextNodes=function(a,b,c,d,e,f,g,k,l,m,n){a+=this.state.dx;b+=this.state.dy;var p=this.state.scale,q=n.firstChild,r=q.firstChild,t=r.firstChild,u=t.firstChild,x=this.getTextCss();q.setAttribute("width",Math.ceil(1/Math.min(1,p)*100)+"%");q.setAttribute("height",Math.ceil(1/Math.min(1,p)*100)+"%");q.setAttribute("style","overflow: visible;");q.setAttribute("pointer-events","none");mxSvgCanvas2D.createCss(c,d,e,f,g,k,l,null!=this.state.fontBackgroundColor?this.state.fontBackgroundColor:
-null,null!=this.state.fontBorderColor?this.state.fontBorderColor:null,"display: flex; align-items: unsafe "+(f==mxConstants.ALIGN_TOP?"flex-start":f==mxConstants.ALIGN_BOTTOM?"flex-end":"center")+"; justify-content: unsafe "+(e==mxConstants.ALIGN_LEFT?"flex-start":e==mxConstants.ALIGN_RIGHT?"flex-end":"center")+"; ",x,p,mxUtils.bind(this,function(c,d,e,f,g){r.setAttribute("style",e+"padding-left: "+Math.round(a+c)+"px; padding-top: "+Math.round(b+d)+"px;");t.setAttribute("style",f);u.setAttribute("style",
-g);c=(this.rotateHtml?this.state.rotation:0)+(null!=m?m:0);c=(0!=this.foOffset?"translate("+this.foOffset+" "+this.foOffset+") ":"")+(1!=p?"scale("+p+") ":"")+(0!=c?"rotate("+c+" "+a+" "+b+")":"");""!=c?n.setAttribute("transform",c):n.removeAttribute("transform");1!=this.state.alpha?n.setAttribute("opacity",this.state.alpha):n.removeAttribute("opacity")}))};
+mxSvgCanvas2D.prototype.addForeignObject=function(a,b,c,d,e,f,g,k,l,m,n,p,q,r,t){q=this.createElement("g");var u=this.createElement("foreignObject");u.setAttribute("style","overflow: visible; text-align: left;");u.setAttribute("pointer-events","none");r.ownerDocument!=document&&(r=mxUtils.importNodeImplementation(u.ownerDocument,r,!0));u.appendChild(r);q.appendChild(u);this.updateTextNodes(a,b,c,d,f,g,k,m,n,p,q);this.root.ownerDocument!=document&&(a=this.createAlternateContent(u,a,b,c,d,e,f,g,k,l,
+m,n,p),null!=a&&(u.setAttribute("requiredFeatures","http://www.w3.org/TR/SVG11/feature#Extensibility"),b=this.createElement("switch"),b.appendChild(u),b.appendChild(a),q.appendChild(b)));t.appendChild(q)};
+mxSvgCanvas2D.prototype.updateTextNodes=function(a,b,c,d,e,f,g,k,l,m,n){var p=this.state.scale;mxSvgCanvas2D.createCss(c,d,e,f,g,k,l,null!=this.state.fontBackgroundColor?this.state.fontBackgroundColor:null,null!=this.state.fontBorderColor?this.state.fontBorderColor:null,"display: flex; align-items: unsafe "+(f==mxConstants.ALIGN_TOP?"flex-start":f==mxConstants.ALIGN_BOTTOM?"flex-end":"center")+"; justify-content: unsafe "+(e==mxConstants.ALIGN_LEFT?"flex-start":e==mxConstants.ALIGN_RIGHT?"flex-end":
+"center")+"; ",this.getTextCss(),p,mxUtils.bind(this,function(c,d,e,f,g){a+=this.state.dx;b+=this.state.dy;var k=n.firstChild,l=k.firstChild,q=l.firstChild,r=(this.rotateHtml?this.state.rotation:0)+(null!=m?m:0),t=(0!=this.foOffset?"translate("+this.foOffset+" "+this.foOffset+")":"")+(1!=p?"scale("+p+")":"");q.firstChild.setAttribute("style",g);q.setAttribute("style",f);k.setAttribute("width",Math.ceil(1/Math.min(1,p)*100)+"%");k.setAttribute("height",Math.ceil(1/Math.min(1,p)*100)+"%");d=Math.round(b+
+d);0>d?k.setAttribute("y",d):(k.removeAttribute("y"),e+="padding-top: "+d+"px; ");l.setAttribute("style",e+"margin-left: "+Math.round(a+c)+"px;");t+=0!=r?"rotate("+r+" "+a+" "+b+")":"";""!=t?n.setAttribute("transform",t):n.removeAttribute("transform");1!=this.state.alpha?n.setAttribute("opacity",this.state.alpha):n.removeAttribute("opacity")}))};
 mxSvgCanvas2D.createCss=function(a,b,c,d,e,f,g,k,l,m,n,p,q){p="box-sizing: border-box; text-align: "+(c==mxConstants.ALIGN_LEFT?"left":c==mxConstants.ALIGN_RIGHT?"right":"center")+"; ";var r=mxUtils.getAlignmentAsPoint(c,d);c="overflow: hidden; ";d="width: 1px; ";var t="height: 1px; ",u=r.x*a,r=r.y*b;g?(d="width: "+Math.round(a)+"px; ",p+="max-height: "+Math.round(b)+"px; ",r=0):"fill"==f?(d="width: "+Math.round(a)+"px; ",t="height: "+Math.round(b)+"px; ",n+="width: 100%; height: 100%; ",p+=d+t):
 "width"==f?(d="width: "+Math.round(a)+"px; ",n+="width: 100%; ",p+=d,r=0,0<b&&(p+="max-height: "+Math.round(b)+"px; ")):(c="",r=0);b="";null!=k&&(b+="background-color: "+k+"; ");null!=l&&(b+="border: 1px solid "+l+"; ");""==c||g?n+=b:p+=b;e&&0<a?(n+="white-space: normal; word-wrap: "+mxConstants.WORD_WRAP+"; ",d="width: "+Math.round(a)+"px; ",""!=c&&"fill"!=f&&(r=0)):(n+="white-space: nowrap; ",""==c&&(u=0));q(u,r,m+d+t,p+c,n,c)};
 mxSvgCanvas2D.prototype.getTextCss=function(){var a=this.state,b="display: inline-block; font-size: "+a.fontSize+"px; font-family: "+a.fontFamily+"; color: "+a.fontColor+"; line-height: "+(mxConstants.ABSOLUTE_LINE_HEIGHT?a.fontSize*mxConstants.LINE_HEIGHT+"px":mxConstants.LINE_HEIGHT*this.lineHeightCorrection)+"; pointer-events: "+(this.pointerEvents?this.pointerEventsValue:"none")+"; ";(a.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&(b+="font-weight: bold; ");(a.fontStyle&mxConstants.FONT_ITALIC)==
@@ -2508,13 +2508,13 @@ Graph.prototype.defaultPageBorderColor="#ffffff";Graph.prototype.scrollTileSize=
 Graph.prototype.defaultThemes={};Graph.prototype.baseUrl=null!=urlParams.base?decodeURIComponent(urlParams.base):(window!=window.top?document.referrer:document.location.toString()).split("#")[0];Graph.prototype.editAfterInsert=!1;Graph.prototype.builtInProperties=["label","tooltip","placeholders","placeholder"];Graph.prototype.standalone=!1;
 Graph.prototype.init=function(a){mxGraph.prototype.init.apply(this,arguments);this.cellRenderer.initializeLabel=function(a,d){mxCellRenderer.prototype.initializeLabel.apply(this,arguments);var b=a.view.graph.tolerance,c=!0,e=null,h=mxUtils.bind(this,function(a){c=!0;e=new mxPoint(mxEvent.getClientX(a),mxEvent.getClientY(a))}),g=mxUtils.bind(this,function(a){c=c&&null!=e&&Math.abs(e.x-mxEvent.getClientX(a))<b&&Math.abs(e.y-mxEvent.getClientY(a))<b}),k=mxUtils.bind(this,function(b){if(c)for(var e=mxEvent.getSource(b);null!=
 e&&e!=d.node;){if("a"==e.nodeName.toLowerCase()){a.view.graph.labelLinkClicked(a,e,b);break}e=e.parentNode}});mxEvent.addGestureListeners(d.node,h,g,k);mxEvent.addListener(d.node,"click",function(a){mxEvent.consume(a)})};this.initLayoutManager()};
-(function(){Graph.prototype.useCssTransforms=!1;Graph.prototype.currentScale=1;Graph.prototype.currentTranslate=new mxPoint(0,0);Graph.prototype.isFastZoomEnabled=function(){return"nocss"!=urlParams.zoom&&!mxClient.NO_FO&&!mxClient.IS_EDGE&&!this.useCssTransforms&&this.isCssTransformsSupported()};Graph.prototype.isCssTransformsSupported=function(){return this.dialect==mxConstants.DIALECT_SVG&&!mxClient.NO_FO};Graph.prototype.getCellAt=function(a,c,d,h,g,k){this.useCssTransforms&&(a=a/this.currentScale-
-this.currentTranslate.x,c=c/this.currentScale-this.currentTranslate.y);return this.getScaledCellAt.apply(this,arguments)};Graph.prototype.getScaledCellAt=function(a,c,d,h,g,k){h=null!=h?h:!0;g=null!=g?g:!0;null==d&&(d=this.getCurrentRoot(),null==d&&(d=this.getModel().getRoot()));if(null!=d)for(var b=this.model.getChildCount(d)-1;0<=b;b--){var e=this.model.getChildAt(d,b),f=this.getScaledCellAt(a,c,e,h,g,k);if(null!=f)return f;if(this.isCellVisible(e)&&(g&&this.model.isEdge(e)||h&&this.model.isVertex(e))&&
-(f=this.view.getState(e),null!=f&&(null==k||!k(f,a,c))&&this.intersects(f,a,c)))return e}return null};mxCellHighlight.prototype.getStrokeWidth=function(a){a=this.strokeWidth;this.graph.useCssTransforms&&(a/=this.graph.currentScale);return a};mxGraphView.prototype.getGraphBounds=function(){var a=this.graphBounds;if(this.graph.useCssTransforms)var c=this.graph.currentTranslate,d=this.graph.currentScale,a=new mxRectangle((a.x+c.x)*d,(a.y+c.y)*d,a.width*d,a.height*d);return a};mxGraphView.prototype.viewStateChanged=
-function(){this.graph.useCssTransforms?this.validate():this.revalidate();this.graph.sizeDidChange()};var a=mxGraphView.prototype.validate;mxGraphView.prototype.validate=function(b){this.graph.useCssTransforms&&(this.graph.currentScale=this.scale,this.graph.currentTranslate.x=this.translate.x,this.graph.currentTranslate.y=this.translate.y,this.scale=1,this.translate.x=0,this.translate.y=0);a.apply(this,arguments);this.graph.useCssTransforms&&(this.graph.updateCssTransform(),this.scale=this.graph.currentScale,
-this.translate.x=this.graph.currentTranslate.x,this.translate.y=this.graph.currentTranslate.y)};Graph.prototype.updateCssTransform=function(){var a=this.view.getDrawPane();if(null!=a)if(a=a.parentNode,this.useCssTransforms){var c=a.getAttribute("transform");a.setAttribute("transformOrigin","0 0");var d=Math.round(100*this.currentScale)/100;a.setAttribute("transform","scale("+d+","+d+")translate("+Math.round(100*this.currentTranslate.x)/100+","+Math.round(100*this.currentTranslate.y)/100+")");if(c!=
-a.getAttribute("transform"))try{if(mxClient.IS_EDGE){var h=a.style.display;a.style.display="none";a.getBBox();a.style.display=h}}catch(g){}}else a.removeAttribute("transformOrigin"),a.removeAttribute("transform")};var c=mxGraphView.prototype.validateBackgroundPage;mxGraphView.prototype.validateBackgroundPage=function(){var a=this.graph.useCssTransforms,d=this.scale,e=this.translate;a&&(this.scale=this.graph.currentScale,this.translate=this.graph.currentTranslate);c.apply(this,arguments);a&&(this.scale=
-d,this.translate=e)};var d=mxGraph.prototype.updatePageBreaks;mxGraph.prototype.updatePageBreaks=function(a,c,e){var b=this.useCssTransforms,f=this.view.scale,k=this.view.translate;b&&(this.view.scale=1,this.view.translate=new mxPoint(0,0),this.useCssTransforms=!1);d.apply(this,arguments);b&&(this.view.scale=f,this.view.translate=k,this.useCssTransforms=!0)}})();Graph.prototype.isLightboxView=function(){return this.lightbox};Graph.prototype.isViewer=function(){return!1};
+(function(){Graph.prototype.useCssTransforms=!1;Graph.prototype.currentScale=1;Graph.prototype.currentTranslate=new mxPoint(0,0);Graph.prototype.isFastZoomEnabled=function(){return"nocss"!=urlParams.zoom&&!mxClient.NO_FO&&!mxClient.IS_EDGE&&!this.useCssTransforms&&this.isCssTransformsSupported()};Graph.prototype.isCssTransformsSupported=function(){return this.dialect==mxConstants.DIALECT_SVG&&!mxClient.NO_FO&&(!this.lightbox||!mxClient.IS_SF)};Graph.prototype.getCellAt=function(a,c,d,h,g,k){this.useCssTransforms&&
+(a=a/this.currentScale-this.currentTranslate.x,c=c/this.currentScale-this.currentTranslate.y);return this.getScaledCellAt.apply(this,arguments)};Graph.prototype.getScaledCellAt=function(a,c,d,h,g,k){h=null!=h?h:!0;g=null!=g?g:!0;null==d&&(d=this.getCurrentRoot(),null==d&&(d=this.getModel().getRoot()));if(null!=d)for(var b=this.model.getChildCount(d)-1;0<=b;b--){var e=this.model.getChildAt(d,b),f=this.getScaledCellAt(a,c,e,h,g,k);if(null!=f)return f;if(this.isCellVisible(e)&&(g&&this.model.isEdge(e)||
+h&&this.model.isVertex(e))&&(f=this.view.getState(e),null!=f&&(null==k||!k(f,a,c))&&this.intersects(f,a,c)))return e}return null};mxCellHighlight.prototype.getStrokeWidth=function(a){a=this.strokeWidth;this.graph.useCssTransforms&&(a/=this.graph.currentScale);return a};mxGraphView.prototype.getGraphBounds=function(){var a=this.graphBounds;if(this.graph.useCssTransforms)var c=this.graph.currentTranslate,d=this.graph.currentScale,a=new mxRectangle((a.x+c.x)*d,(a.y+c.y)*d,a.width*d,a.height*d);return a};
+mxGraphView.prototype.viewStateChanged=function(){this.graph.useCssTransforms?this.validate():this.revalidate();this.graph.sizeDidChange()};var a=mxGraphView.prototype.validate;mxGraphView.prototype.validate=function(b){this.graph.useCssTransforms&&(this.graph.currentScale=this.scale,this.graph.currentTranslate.x=this.translate.x,this.graph.currentTranslate.y=this.translate.y,this.scale=1,this.translate.x=0,this.translate.y=0);a.apply(this,arguments);this.graph.useCssTransforms&&(this.graph.updateCssTransform(),
+this.scale=this.graph.currentScale,this.translate.x=this.graph.currentTranslate.x,this.translate.y=this.graph.currentTranslate.y)};Graph.prototype.updateCssTransform=function(){var a=this.view.getDrawPane();if(null!=a)if(a=a.parentNode,this.useCssTransforms){var c=a.getAttribute("transform");a.setAttribute("transformOrigin","0 0");var d=Math.round(100*this.currentScale)/100;a.setAttribute("transform","scale("+d+","+d+")translate("+Math.round(100*this.currentTranslate.x)/100+","+Math.round(100*this.currentTranslate.y)/
+100+")");if(c!=a.getAttribute("transform"))try{if(mxClient.IS_EDGE){var h=a.style.display;a.style.display="none";a.getBBox();a.style.display=h}}catch(g){}}else a.removeAttribute("transformOrigin"),a.removeAttribute("transform")};var c=mxGraphView.prototype.validateBackgroundPage;mxGraphView.prototype.validateBackgroundPage=function(){var a=this.graph.useCssTransforms,d=this.scale,e=this.translate;a&&(this.scale=this.graph.currentScale,this.translate=this.graph.currentTranslate);c.apply(this,arguments);
+a&&(this.scale=d,this.translate=e)};var d=mxGraph.prototype.updatePageBreaks;mxGraph.prototype.updatePageBreaks=function(a,c,e){var b=this.useCssTransforms,f=this.view.scale,k=this.view.translate;b&&(this.view.scale=1,this.view.translate=new mxPoint(0,0),this.useCssTransforms=!1);d.apply(this,arguments);b&&(this.view.scale=f,this.view.translate=k,this.useCssTransforms=!0)}})();Graph.prototype.isLightboxView=function(){return this.lightbox};Graph.prototype.isViewer=function(){return!1};
 Graph.prototype.labelLinkClicked=function(a,c,d){c=c.getAttribute("href");if(null!=c&&!this.isCustomLink(c)&&mxEvent.isLeftMouseButton(d)&&!mxEvent.isPopupTrigger(d)||mxEvent.isTouchEvent(d)){if(!this.isEnabled()||this.isCellLocked(a.cell))a=this.isBlankLink(c)?this.linkTarget:"_top",this.openLink(this.getAbsoluteUrl(c),a);mxEvent.consume(d)}};
 Graph.prototype.openLink=function(a,c,d){var b=window;try{if("_self"==c&&window!=window.top)window.location.href=a;else if(a.substring(0,this.baseUrl.length)==this.baseUrl&&"#"==a.charAt(this.baseUrl.length)&&"_top"==c&&window==window.top){var f=a.split("#")[1];window.location.hash=="#"+f&&(window.location.hash="");window.location.hash=f}else b=window.open(a,c),null==b||d||(b.opener=null)}catch(e){}return b};Graph.prototype.getLinkTitle=function(a){return a.substring(a.lastIndexOf("/")+1)};
 Graph.prototype.isCustomLink=function(a){return"data:"==a.substring(0,5)};Graph.prototype.customLinkClicked=function(a){return!1};Graph.prototype.isExternalProtocol=function(a){return"mailto:"===a.substring(0,7)};Graph.prototype.isBlankLink=function(a){return!this.isExternalProtocol(a)&&("blank"===this.linkPolicy||"self"!==this.linkPolicy&&!this.isRelativeUrl(a)&&a.substring(0,this.domainUrl.length)!==this.domainUrl)};
@@ -8464,7 +8464,7 @@ k.className="geBtn";a.editor.cancelFirst&&p.appendChild(k);a.isOffline()||(v=mxU
 "geBtn gePrimaryBtn";p.appendChild(v);a.editor.cancelFirst||p.appendChild(k);l.appendChild(p);this.container=l};var H=ChangePageSetup.prototype.execute;ChangePageSetup.prototype.execute=function(){null==this.page&&(this.page=this.ui.currentPage);this.page!=this.ui.currentPage?null!=this.page.viewState&&(this.ignoreColor||(this.page.viewState.background=this.color),this.ignoreImage||(this.page.viewState.backgroundImage=this.image),null!=this.format&&(this.page.viewState.pageFormat=this.format),null!=
 this.mathEnabled&&(this.page.viewState.mathEnabled=this.mathEnabled),null!=this.shadowVisible&&(this.page.viewState.shadowVisible=this.shadowVisible)):(H.apply(this,arguments),null!=this.mathEnabled&&this.mathEnabled!=this.ui.isMathEnabled()&&(this.ui.setMathEnabled(this.mathEnabled),this.mathEnabled=!this.mathEnabled),null!=this.shadowVisible&&this.shadowVisible!=this.ui.editor.graph.shadowVisible&&(this.ui.editor.graph.setShadowVisible(this.shadowVisible),this.shadowVisible=!this.shadowVisible))};
 Editor.prototype.useCanvasForExport=!1;try{var x=document.createElement("canvas"),B=new Image;B.onload=function(){try{x.getContext("2d").drawImage(B,0,0);var a=x.toDataURL("image/png");Editor.prototype.useCanvasForExport=null!=a&&6<a.length}catch(C){}};B.src="data:image/svg+xml;base64,"+btoa(unescape(encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1px" height="1px" version="1.1"><foreignObject pointer-events="all" width="1" height="1"><div xmlns="http://www.w3.org/1999/xhtml"></div></foreignObject></svg>')))}catch(A){}})();
-(function(){var a=new mxObjectCodec(new ChangePageSetup,["ui","previousColor","previousImage","previousFormat"]);a.beforeDecode=function(a,d,b){b.ui=a.ui;return d};a.afterDecode=function(a,d,b){b.previousColor=b.color;b.previousImage=b.image;b.previousFormat=b.format;null!=b.foldingEnabled&&(b.foldingEnabled=!b.foldingEnabled);null!=b.mathEnabled&&(b.mathEnabled=!b.mathEnabled);null!=b.shadowVisible&&(b.shadowVisible=!b.shadowVisible);return b};mxCodecRegistry.register(a)})();(function(){EditorUi.VERSION="12.5.0";EditorUi.compactUi="atlas"!=uiTheme;mxGraphView.prototype.defaultDarkGridColor="#6e6e6e";"dark"==uiTheme&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&/.*\.draw\.io$/.test(window.location.hostname)&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost="https://www.draw.io";EditorUi.lastErrorMessage=null;EditorUi.ignoredAnonymizedChars="\n\t`~!@#$%^&*()_+{}|:\"<>?-=[];'./,\n\t";
+(function(){var a=new mxObjectCodec(new ChangePageSetup,["ui","previousColor","previousImage","previousFormat"]);a.beforeDecode=function(a,d,b){b.ui=a.ui;return d};a.afterDecode=function(a,d,b){b.previousColor=b.color;b.previousImage=b.image;b.previousFormat=b.format;null!=b.foldingEnabled&&(b.foldingEnabled=!b.foldingEnabled);null!=b.mathEnabled&&(b.mathEnabled=!b.mathEnabled);null!=b.shadowVisible&&(b.shadowVisible=!b.shadowVisible);return b};mxCodecRegistry.register(a)})();(function(){EditorUi.VERSION="12.5.1";EditorUi.compactUi="atlas"!=uiTheme;mxGraphView.prototype.defaultDarkGridColor="#6e6e6e";"dark"==uiTheme&&(mxGraphView.prototype.gridColor=mxGraphView.prototype.defaultDarkGridColor);EditorUi.enableLogging="1"!=urlParams.stealth&&/.*\.draw\.io$/.test(window.location.hostname)&&"support.draw.io"!=window.location.hostname;EditorUi.drawHost="https://www.draw.io";EditorUi.lastErrorMessage=null;EditorUi.ignoredAnonymizedChars="\n\t`~!@#$%^&*()_+{}|:\"<>?-=[];'./,\n\t";
 EditorUi.templateFile=TEMPLATE_PATH+"/index.xml";EditorUi.cacheUrl="1"==urlParams.dev?"/cache":window.REALTIME_URL;null==EditorUi.cacheUrl&&"undefined"!==typeof DrawioFile&&(DrawioFile.SYNC="none");Editor.cacheTimeout=1E4;EditorUi.enablePlantUml=EditorUi.enableLogging;EditorUi.isElectronApp=null!=window&&null!=window.process&&null!=window.process.versions&&null!=window.process.versions.electron;EditorUi.scratchpadHelpLink="https://desk.draw.io/support/solutions/articles/16000042367";EditorUi.logError=
 function(a,b,c,d,e){if("1"==urlParams.dev)EditorUi.debug("logError",a,b,c,d,e);else if(EditorUi.enableLogging)try{if(a!=EditorUi.lastErrorMessage&&(null==a||null==b||-1==a.indexOf("Script error")&&-1==a.indexOf("extension"))&&null!=a&&0>a.indexOf("DocumentClosedError")){EditorUi.lastErrorMessage=a;var f=0<=a.indexOf("NetworkError")||0<=a.indexOf("SecurityError")||0<=a.indexOf("NS_ERROR_FAILURE")||0<=a.indexOf("out of memory")?"CONFIG":"SEVERE",l=null!=window.DRAWIO_LOG_URL?window.DRAWIO_LOG_URL:"";
 e=null!=e?e:Error(a);(new Image).src=l+"/log?severity="+f+"&v="+encodeURIComponent(EditorUi.VERSION)+"&msg=clientError:"+encodeURIComponent(a)+":url:"+encodeURIComponent(window.location.href)+":lnum:"+encodeURIComponent(c)+(null!=d?":colno:"+encodeURIComponent(d):"")+(null!=e&&null!=e.stack?"&stack="+encodeURIComponent(e.stack):"")}}catch(y){}};EditorUi.logEvent=function(a){if("1"==urlParams.dev)EditorUi.debug("logEvent",a);else if(EditorUi.enableLogging)try{var b=null!=window.DRAWIO_LOG_URL?window.DRAWIO_LOG_URL:
@@ -8883,8 +8883,8 @@ mxGraphView.prototype.defaultDarkGridColor),null==mxSettings.settings.autosave&&
 this.activityListener=mxUtils.bind(this,function(a){this.lastActivity=new Date;this.start()});mxEvent.addListener(document,mxClient.IS_POINTER?"pointermove":"mousemove",this.activityListener);mxEvent.addListener(document,"keypress",this.activityListener);mxEvent.addListener(window,"focus",this.activityListener);!mxClient.IS_POINTER&&mxClient.IS_TOUCH&&(mxEvent.addListener(document,"touchstart",this.activityListener),mxEvent.addListener(document,"touchmove",this.activityListener));this.pusherErrorListener=
 mxUtils.bind(this,function(a){null!=a.error&&null!=a.error.data&&4004===a.error.data.code&&EditorUi.logError("Error: Pusher Limit",null,this.file.getId())});this.connectionListener=mxUtils.bind(this,function(){this.updateOnlineState();this.updateStatus();if(this.isConnected())if(this.announced)this.fileChangedNotify();else{var a=this.file.getCurrentUser(),d={a:"join"};null!=a&&(d.name=encodeURIComponent(a.displayName),d.uid=a.id);mxUtils.post(EditorUi.cacheUrl,this.getIdParameters()+"&msg="+encodeURIComponent(this.objectToString(this.createMessage(d))));
 this.file.stats.msgSent++;this.announced=!0}});this.changeListener=mxUtils.bind(this,function(a){this.file.stats.msgReceived++;this.lastActivity=new Date;if(this.enabled&&!this.file.inConflictState&&!this.file.redirectDialogShowing)try{var c=this.stringToObject(a);null!=c&&(EditorUi.debug("Sync.message",[this],c,a.length,"bytes"),c.v>DrawioFileSync.PROTOCOL?this.file.redirectToNewApp(mxUtils.bind(this,function(){})):c.v===DrawioFileSync.PROTOCOL&&null!=c.d&&this.handleMessageData(c.d))}catch(b){this.isConnected()&&
-this.fileChangedNotify(),EditorUi.logError("Protocol Error "+b.message,null,"data_"+(null!=a?a.length:"null")+"_file_"+this.file.getHash()+"_client_"+this.clientId),null!=window.console&&console.log(b)}})};DrawioFileSync.PROTOCOL=6;mxUtils.extend(DrawioFileSync,mxEventSource);DrawioFileSync.prototype.maxCacheEntrySize=1E6;DrawioFileSync.prototype.enabled=!0;DrawioFileSync.prototype.updateStatusInterval=1E4;DrawioFileSync.prototype.channelId=null;DrawioFileSync.prototype.channel=null;
-DrawioFileSync.prototype.catchupRetryCount=0;DrawioFileSync.prototype.maxCatchupRetries=15;DrawioFileSync.prototype.maxCacheReadyRetries=1;DrawioFileSync.prototype.cacheReadyDelay=700;DrawioFileSync.prototype.inactivityTimeoutSeconds=1800;DrawioFileSync.prototype.lastActivity=null;
+this.fileChangedNotify()}})};DrawioFileSync.PROTOCOL=6;mxUtils.extend(DrawioFileSync,mxEventSource);DrawioFileSync.prototype.maxCacheEntrySize=1E6;DrawioFileSync.prototype.enabled=!0;DrawioFileSync.prototype.updateStatusInterval=1E4;DrawioFileSync.prototype.channelId=null;DrawioFileSync.prototype.channel=null;DrawioFileSync.prototype.catchupRetryCount=0;DrawioFileSync.prototype.maxCatchupRetries=15;DrawioFileSync.prototype.maxCacheReadyRetries=1;DrawioFileSync.prototype.cacheReadyDelay=700;
+DrawioFileSync.prototype.inactivityTimeoutSeconds=1800;DrawioFileSync.prototype.lastActivity=null;
 DrawioFileSync.prototype.start=function(){null==this.channelId&&(this.channelId=this.file.getChannelId());null==this.key&&(this.key=this.file.getChannelKey());if(null==this.pusher&&null!=this.channelId&&"hidden"!=document.visibilityState){this.pusher=this.ui.getPusher();if(null!=this.pusher){try{null!=this.pusher.connection&&this.pusher.connection.bind("error",this.pusherErrorListener)}catch(a){}try{this.pusher.connect(),this.channel=this.pusher.subscribe(this.channelId),EditorUi.debug("Sync.start",
 [this,"v"+DrawioFileSync.PROTOCOL])}catch(a){}this.installListeners()}window.setTimeout(mxUtils.bind(this,function(){this.lastModified=this.file.getLastModifiedDate();this.lastActivity=new Date;this.resetUpdateStatusThread();this.updateOnlineState();this.updateStatus()},0))}};DrawioFileSync.prototype.isConnected=function(){return null!=this.pusher&&null!=this.pusher.connection?"connected"==this.pusher.connection.state:!1};
 DrawioFileSync.prototype.updateOnlineState=function(){var a=mxUtils.bind(this,function(a){mxEvent.addListener(a,"click",mxUtils.bind(this,function(a){this.enabled=!this.enabled;this.ui.updateButtonContainer();this.resetUpdateStatusThread();this.updateOnlineState();this.updateStatus();!this.file.inConflictState&&this.enabled&&this.fileChangedNotify()}))});if("min"==uiTheme&&null!=this.ui.buttonContainer){if(null==this.collaboratorsElement){var c=document.createElement("a");c.className="geToolbarButton";
diff --git a/src/main/webapp/js/diagramly/DrawioFileSync.js b/src/main/webapp/js/diagramly/DrawioFileSync.js
index 2f24c1a11ad6589e25dd31cc00d5533844b92d8e..4c9b498272fd7e0eae524e8e384de27a11be3715 100644
--- a/src/main/webapp/js/diagramly/DrawioFileSync.js
+++ b/src/main/webapp/js/diagramly/DrawioFileSync.js
@@ -144,16 +144,16 @@ DrawioFileSync = function(file)
 				}
 				
 				// NOTE: Probably UTF16 in username for join/leave message causing this
-				var len = (data != null) ? data.length : 'null';
-				
-				EditorUi.logError('Protocol Error ' + e.message,
-					null, 'data_' + len + '_file_' + this.file.getHash() +
-					'_client_' + this.clientId);
-				
-				if (window.console != null)
-				{
-					console.log(e);
-				}
+//				var len = (data != null) ? data.length : 'null';
+//				
+//				EditorUi.logError('Protocol Error ' + e.message,
+//					null, 'data_' + len + '_file_' + this.file.getHash() +
+//					'_client_' + this.clientId);
+//				
+//				if (window.console != null)
+//				{
+//					console.log(e);
+//				}
 			}
 		}
 	});
diff --git a/src/main/webapp/js/diagramly/Editor.js b/src/main/webapp/js/diagramly/Editor.js
index 13ecffa8ed45456eb78f05503c796a4f5c4076f2..0f4cbc7eec7c4683247ef6b51ce454a00b06d5d3 100644
--- a/src/main/webapp/js/diagramly/Editor.js
+++ b/src/main/webapp/js/diagramly/Editor.js
@@ -897,7 +897,7 @@
 	Editor.prototype.timeout = 25000;
 	
 	/**
-	 * This should not be enabled if reflows are required for math rendering.
+	 * Zoomed mathjax output is causing problems in Safari.
 	 */
 	Editor.prototype.useForeignObjectForMath = !mxClient.IS_SF;
 
diff --git a/src/main/webapp/js/diagramly/mxTableLayout.js b/src/main/webapp/js/diagramly/mxTableLayout.js
index 1953a173fb36525c29bff87acfafda0b5ec0e301..f0dc88701ba0c6df1c235252c57679402e38fce3 100644
--- a/src/main/webapp/js/diagramly/mxTableLayout.js
+++ b/src/main/webapp/js/diagramly/mxTableLayout.js
@@ -260,7 +260,7 @@ mxTableLayout.prototype.calcDims = function(parent)
 		var cellCount = rows * cols;
 		
 		//if auto-add without parent-resize, then each cell size in the table depends on how many columns/rows
-		if (/*!this.resizeParent && */(this.autoAddCol || this.autoAddRow) && childCount > cellCount)
+		if (!this.resizeParent && (this.autoAddCol || this.autoAddRow) && childCount > cellCount)
 		{
 			var actualChildCount = 0;
 			//get actual child count (movable and not ignored)
@@ -490,6 +490,8 @@ function mxTableLayoutHandle(index, isCol, state, layoutDims)
 mxUtils.extend(mxTableLayoutHandle, mxHandle);
 
 mxTableLayoutHandle.prototype.color = '#00FF00';
+mxTableLayoutHandle.prototype.MIN_COL_W = 10;
+mxTableLayoutHandle.prototype.MIN_ROW_H = 10;
 
 mxTableLayoutHandle.prototype.createShape = function(html)
 {
@@ -545,46 +547,277 @@ mxTableLayoutHandle.prototype.getPosition = function(bounds)
 mxTableLayoutHandle.prototype.setPosition = function(bounds, pt)
 {
 	this.state.style['resizeParent'] = '0';
+	var anotherRedraw = [];
 	
 	if (this.isCol)
 	{
+		if (this.origCellWidth == null)
+		{
+			this.origCellWidth = this.dims.cellWidth.slice();
+		}
+		
 		this.state.style['equalColumns'] = '0';
 		var oldColW = this.dims.cellWidth[this.index];
 		var newColW = oldColW + pt.x - this.x;
-		this.dims.cellWidth[this.index] = newColW;
 		
-		if (newColW > oldColW)
+		if (newColW < this.MIN_COL_W)
+		{
+			this.dims.cellWidth[this.index] = this.MIN_COL_W;
+			var addedW = oldColW - this.MIN_COL_W;
+			newColW = Math.abs(newColW - this.MIN_COL_W);
+			var i = this.index - 1;
+			
+			while (i >= 0 && newColW > 0)
+			{
+				if (newColW < this.dims.cellWidth[i] - this.MIN_COL_W)
+				{
+					this.dims.cellWidth[i] -= newColW;
+					addedW += newColW;
+					newColW = 0;
+				}
+				else
+				{
+					var diff = this.dims.cellWidth[i] - this.MIN_COL_W;
+					newColW -= diff;
+					addedW += diff;
+					this.dims.cellWidth[i] = this.MIN_COL_W;
+				}
+				
+				anotherRedraw.push(i);
+				i--;
+			}
+			
+			this.dims.cellWidth[this.index + 1] += addedW;
+		}
+		else if (this.dims.cellWidth[this.index + 1] < (newColW - oldColW + this.MIN_COL_W))
 		{
-			this.dims.cellWidth[this.index + 1] -= (newColW - oldColW);
+			var addedW = this.dims.cellWidth[this.index + 1] - this.MIN_COL_W;
+			this.dims.cellWidth[this.index + 1] = this.MIN_COL_W;
+			var neededW = newColW - oldColW;
+			var i = this.index + 2;
+			
+			while (i < this.dims.cols && neededW > 0)
+			{
+				if (neededW < this.dims.cellWidth[i] - this.MIN_COL_W)
+				{
+					this.dims.cellWidth[i] -= neededW;
+					addedW += neededW;
+					neededW = 0;
+				}
+				else
+				{
+					var diff = this.dims.cellWidth[i] - this.MIN_COL_W;
+					neededW -= diff;
+					addedW += diff;
+					this.dims.cellWidth[i] = this.MIN_COL_W;
+				}
+				
+				anotherRedraw.push(i - 1);
+				i++;
+			}
+			
+			this.dims.cellWidth[this.index] += addedW;
 		}
 		else
 		{
-			this.dims.cellWidth[this.index + 1] += (oldColW - newColW);
+			if (newColW > oldColW)
+			{
+				var diff = newColW - oldColW;
+				var addAll = false;
+				var i;
+				
+				//check other cols if we already resized them
+				for (i = 0; i < this.index && diff > 0; i++)
+				{
+					var cDiff = this.origCellWidth[i] - this.dims.cellWidth[i];
+
+					if (cDiff != 0)
+					{
+						cDiff = Math.min(diff, cDiff);
+						diff -= cDiff;
+						this.dims.cellWidth[i] += cDiff;
+						anotherRedraw.push(i);
+						addAll = true;
+					}
+				}
+				
+				for (; i < this.index && addAll; i++)
+				{
+					anotherRedraw.push(i);
+				}
+				
+				this.dims.cellWidth[this.index] += diff;
+				this.dims.cellWidth[this.index + 1] -= (newColW - oldColW);
+			}
+			else
+			{
+				var diff = oldColW - newColW;
+				var addAll = false;
+				var i;
+				
+				//check other cols if we already resized them
+				for (i = this.dims.cols - 2; i >= this.index  && diff > 0; i--)
+				{
+					var cDiff = this.origCellWidth[i + 1] - this.dims.cellWidth[i + 1];
+
+					if (cDiff != 0)
+					{
+						cDiff = Math.min(diff, cDiff);
+						diff -= cDiff;
+						this.dims.cellWidth[i + 1] += cDiff;
+						anotherRedraw.push(i); // FIXME this.index can be redrawn twice 
+						addAll = true;
+					}
+				}
+				
+				for (; i > this.index && addAll; i--)
+				{
+					anotherRedraw.push(i);
+				}
+				
+				this.dims.cellWidth[this.index] = newColW;
+				this.dims.cellWidth[this.index + 1] += diff;
+			}
 		}
-		
+		console.log(this.dims.cellWidth)
 		var perc = [];
 		
 		for (var i = 0; i < this.dims.cols; i++)
 		{
 			perc.push((this.dims.cellWidth[i] / this.dims.fillWidth) * 100);
 		}
-		
+
 		this.state.style['colPercentages'] = perc.join(',');
 	}
 	else
 	{
+		if (this.origCellHeight == null)
+		{
+			this.origCellHeight = this.dims.cellHeight.slice();
+		}
+			
 		this.state.style['equalRows'] = '0';
-		var oldColH = this.dims.cellHeight[this.index];
-		var newColH = oldColH + pt.y - this.y;
-		this.dims.cellHeight[this.index] = newColH;
+		var oldRowH = this.dims.cellHeight[this.index];
+		var newRowH = oldRowH + pt.y - this.y;
 		
-		if (newColH > oldColH)
+		if (newRowH < this.MIN_ROW_H)
 		{
-			this.dims.cellHeight[this.index + 1] -= (newColH - oldColH);
+			this.dims.cellHeight[this.index] = this.MIN_ROW_H;
+			var addedH = oldRowH - this.MIN_ROW_H;
+			newRowH = Math.abs(newRowH - this.MIN_ROW_H);
+			var i = this.index - 1;
+			
+			while (i >= 0 && newRowH > 0)
+			{
+				if (newRowH < this.dims.cellHeight[i] - this.MIN_ROW_H)
+				{
+					this.dims.cellHeight[i] -= newRowH;
+					addedH += newRowH;
+					newRowH = 0;
+				}
+				else
+				{
+					var diff = this.dims.cellHeight[i] - this.MIN_ROW_H;
+					newRowH -= diff;
+					addedH += diff;
+					this.dims.cellHeight[i] = this.MIN_ROW_H;
+				}
+				
+				anotherRedraw.push(i);
+				i--;
+			}
+			
+			this.dims.cellHeight[this.index + 1] += addedH;
+		}
+		else if (this.dims.cellHeight[this.index + 1] < (newRowH - oldRowH + this.MIN_ROW_H))
+		{
+			var addedH = this.dims.cellHeight[this.index + 1] - this.MIN_ROW_H;
+			this.dims.cellHeight[this.index + 1] = this.MIN_ROW_H;
+			var neededH = newRowH - oldRowH;
+			var i = this.index + 2;
+			
+			while (i < this.dims.rows && neededH > 0)
+			{
+				if (neededH < this.dims.cellHeight[i] - this.MIN_ROW_H)
+				{
+					this.dims.cellHeight[i] -= neededH;
+					addedH += neededH;
+					neededH = 0;
+				}
+				else
+				{
+					var diff = this.dims.cellHeight[i] - this.MIN_ROW_H;
+					neededH -= diff;
+					addedH += diff;
+					this.dims.cellHeight[i] = this.MIN_ROW_H;
+				}
+				
+				anotherRedraw.push(i - 1);
+				i++;
+			}
+			
+			this.dims.cellHeight[this.index] += addedH;
 		}
 		else
 		{
-			this.dims.cellHeight[this.index + 1] += (oldColH - newColH);
+			if (newRowH > oldRowH)
+			{
+				var diff = newRowH - oldRowH;
+				var addAll = false;
+				var i;
+				
+				//check other cols if we already resized them
+				for (i = 0; i < this.index && diff > 0; i++)
+				{
+					var cDiff = this.origCellHeight[i] - this.dims.cellHeight[i];
+
+					if (cDiff != 0)
+					{
+						cDiff = Math.min(diff, cDiff);
+						diff -= cDiff;
+						this.dims.cellHeight[i] += cDiff;
+						anotherRedraw.push(i);
+						addAll = true;
+					}
+				}
+				
+				for (; i < this.index && addAll; i++)
+				{
+					anotherRedraw.push(i);
+				}
+				
+				this.dims.cellHeight[this.index] += diff;
+				this.dims.cellHeight[this.index + 1] -= (newRowH - oldRowH);
+			}
+			else
+			{
+				var diff = oldRowH - newRowH;
+				var addAll = false;
+				var i;
+				
+				//check other cols if we already resized them
+				for (i = this.dims.rows - 2; i >= this.index  && diff > 0; i--)
+				{
+					var cDiff = this.origCellHeight[i + 1] - this.dims.cellHeight[i + 1];
+
+					if (cDiff != 0)
+					{
+						cDiff = Math.min(diff, cDiff);
+						diff -= cDiff;
+						this.dims.cellHeight[i + 1] += cDiff;
+						anotherRedraw.push(i); // FIXME this.index can be redrawn twice 
+						addAll = true;
+					}
+				}
+				
+				for (; i > this.index && addAll; i--)
+				{
+					anotherRedraw.push(i);
+				}
+				
+				this.dims.cellHeight[this.index] = newRowH;
+				this.dims.cellHeight[this.index + 1] += diff;
+			}
 		}
 		
 		var perc = [];
@@ -593,9 +826,16 @@ mxTableLayoutHandle.prototype.setPosition = function(bounds, pt)
 		{
 			perc.push((this.dims.cellHeight[i] / this.dims.fillHeight) * 100);
 		}
-
+		
 		this.state.style['rowPercentages'] = perc.join(',');
 	}
+
+	var handlers = this.isCol? this.dims.colHandlers : this.dims.rowHandlers;
+	
+	for (var i = 0; i < anotherRedraw.length; i++)
+	{
+		handlers[anotherRedraw[i]].redraw();
+	}
 };
 
 mxTableLayoutHandle.prototype.execute = function()
@@ -604,11 +844,13 @@ mxTableLayoutHandle.prototype.execute = function()
 	
 	if (this.isCol)
 	{
+		this.origCellWidth = null;
 		this.copyStyle('equalColumns');
 		this.copyStyle('colPercentages');
 	}
 	else
 	{
+		this.origCellHeight = null;
 		this.copyStyle('equalRows');
 		this.copyStyle('rowPercentages');
 	}
@@ -622,6 +864,7 @@ mxTableLayout.prototype.origCreateCustomHandles = mxVertexHandler.prototype.crea
 
 mxVertexHandler.prototype.createCustomHandles = function()
 {
+	var rowHandlers = [], colHandlers = [];
 	var origHandlers = mxTableLayout.prototype.origCreateCustomHandles.apply(this, arguments);
 	
 	var cell = this.state.cell;
@@ -635,15 +878,21 @@ mxVertexHandler.prototype.createCustomHandles = function()
 		}
 		
 		var dims = layout.calcDims(this.state.cell);
+		dims.rowHandlers = rowHandlers;
+		dims.colHandlers = colHandlers;
 		
 		for (var i = 0; i < dims.rows - 1; i++)
 		{
-			origHandlers.push(new mxTableLayoutHandle(i, false, this.state, dims));
+			var rowH = new mxTableLayoutHandle(i, false, this.state, dims);
+			origHandlers.push(rowH);
+			rowHandlers.push(rowH);
 		}
 		
 		for (var i = 0; i < dims.cols - 1; i++)
 		{
-			origHandlers.push(new mxTableLayoutHandle(i, true, this.state, dims));
+			var colH = new mxTableLayoutHandle(i, true, this.state, dims);
+			origHandlers.push(colH);
+			colHandlers.push(colH);
 		}
 	}
 	
diff --git a/src/main/webapp/js/mxgraph/Graph.js b/src/main/webapp/js/mxgraph/Graph.js
index a77d1b2f9c4a220c72733e1837738395b4207a00..deb63218666bc7ac5281081d9ed6dbee9861ca0e 100644
--- a/src/main/webapp/js/mxgraph/Graph.js
+++ b/src/main/webapp/js/mxgraph/Graph.js
@@ -1363,11 +1363,13 @@ Graph.prototype.init = function(container)
 	};
 
 	/**
-	 * Only foreignObject supported for now (no IE11).
+	 * Only foreignObject supported for now (no IE11). Safari disabled as it ignores
+	 * overflow visible on foreignObject in negative space (lightbox and viewer).
 	 */
 	Graph.prototype.isCssTransformsSupported = function()
 	{
-		return this.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO;
+		return this.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO &&
+			(!this.lightbox || !mxClient.IS_SF);
 	};
 
 	/**
diff --git a/src/main/webapp/js/viewer.min.js b/src/main/webapp/js/viewer.min.js
index 33b93c57977b508e1c3de46fa9fb33ff24d9ea3a..5010d39afd442b6a3362ed41de769aabcde50786 100644
--- a/src/main/webapp/js/viewer.min.js
+++ b/src/main/webapp/js/viewer.min.js
@@ -323,7 +323,7 @@ mxUndoManager.prototype.undo=function(){for(;0<this.indexOfNextAdd;){var a=this.
 mxUndoManager.prototype.redo=function(){for(var a=this.history.length;this.indexOfNextAdd<a;){var b=this.history[this.indexOfNextAdd++];b.redo();if(b.isSignificant()){this.fireEvent(new mxEventObject(mxEvent.REDO,"edit",b));break}}};mxUndoManager.prototype.undoableEditHappened=function(a){this.trim();0<this.size&&this.size==this.history.length&&this.history.shift();this.history.push(a);this.indexOfNextAdd=this.history.length;this.fireEvent(new mxEventObject(mxEvent.ADD,"edit",a))};
 mxUndoManager.prototype.trim=function(){if(this.history.length>this.indexOfNextAdd)for(var a=this.history.splice(this.indexOfNextAdd,this.history.length-this.indexOfNextAdd),b=0;b<a.length;b++)a[b].die()};var mxUrlConverter=function(){};mxUrlConverter.prototype.enabled=!0;mxUrlConverter.prototype.baseUrl=null;mxUrlConverter.prototype.baseDomain=null;
 mxUrlConverter.prototype.updateBaseUrl=function(){this.baseDomain=location.protocol+"//"+location.host;this.baseUrl=this.baseDomain+location.pathname;var a=this.baseUrl.lastIndexOf("/");0<a&&(this.baseUrl=this.baseUrl.substring(0,a+1))};mxUrlConverter.prototype.isEnabled=function(){return this.enabled};mxUrlConverter.prototype.setEnabled=function(a){this.enabled=a};mxUrlConverter.prototype.getBaseUrl=function(){return this.baseUrl};mxUrlConverter.prototype.setBaseUrl=function(a){this.baseUrl=a};
-mxUrlConverter.prototype.getBaseDomain=function(){return this.baseDomain};mxUrlConverter.prototype.setBaseDomain=function(a){this.baseDomain=a};mxUrlConverter.prototype.isRelativeUrl=function(a){return"//"!=a.substring(0,2)&&"http://"!=a.substring(0,7)&&"https://"!=a.substring(0,8)&&"data:image"!=a.substring(0,10)&&"file://"!=a.substring(0,7)};
+mxUrlConverter.prototype.getBaseDomain=function(){return this.baseDomain};mxUrlConverter.prototype.setBaseDomain=function(a){this.baseDomain=a};mxUrlConverter.prototype.isRelativeUrl=function(a){return null!=a&&"//"!=a.substring(0,2)&&"http://"!=a.substring(0,7)&&"https://"!=a.substring(0,8)&&"data:image"!=a.substring(0,10)&&"file://"!=a.substring(0,7)};
 mxUrlConverter.prototype.convert=function(a){this.isEnabled()&&this.isRelativeUrl(a)&&(null==this.getBaseUrl()&&this.updateBaseUrl(),a="/"==a.charAt(0)?this.getBaseDomain()+a:this.getBaseUrl()+a);return a};
 function mxPanningManager(a){this.thread=null;this.active=!1;this.dy=this.dx=this.t0y=this.t0x=this.tdy=this.tdx=0;this.scrollbars=!1;this.scrollTop=this.scrollLeft=0;this.mouseListener={mouseDown:function(a,b){},mouseMove:function(a,b){},mouseUp:mxUtils.bind(this,function(a,b){this.active&&this.stop()})};a.addMouseListener(this.mouseListener);this.mouseUpListener=mxUtils.bind(this,function(){this.active&&this.stop()});mxEvent.addListener(document,"mouseup",this.mouseUpListener);var b=mxUtils.bind(this,
 function(){this.scrollbars=mxUtils.hasScrollbars(a.container);this.scrollLeft=a.container.scrollLeft;this.scrollTop=a.container.scrollTop;return window.setInterval(mxUtils.bind(this,function(){this.tdx-=this.dx;this.tdy-=this.dy;this.scrollbars?(a.panGraph(-a.container.scrollLeft-Math.ceil(this.dx),-a.container.scrollTop-Math.ceil(this.dy)),a.panDx=this.scrollLeft-a.container.scrollLeft,a.panDy=this.scrollTop-a.container.scrollTop,a.fireEvent(new mxEventObject(mxEvent.PAN))):a.panGraph(this.getDx(),
@@ -437,11 +437,11 @@ b.documentElement.appendChild(c);var d=document.createElement("div");d.innerHTML
 "&amp;").replace(/<br>/g,"<br />").replace(/<hr>/g,"<hr />").replace(/(<img[^>]+)>/gm,"$1 />")}return a};
 mxSvgCanvas2D.prototype.createDiv=function(a){mxUtils.isNode(a)||(a="<div><div>"+this.convertHtml(a)+"</div></div>");if(mxClient.IS_IE||mxClient.IS_IE11||!document.createElementNS){mxUtils.isNode(a)&&(a="<div><div>"+mxUtils.getXml(a)+"</div></div>");a='<div xmlns="http://www.w3.org/1999/xhtml">'+a+"</div>";if("ActiveXObject"in window){var b=mxUtils.createMsXmlDocument();b.loadXML(a);return b.documentElement}return mxUtils.parseXml(a).documentElement}b=document.createElementNS("http://www.w3.org/1999/xhtml",
 "div");if(mxUtils.isNode(a)){var c=document.createElement("div"),d=c.cloneNode(!1);this.root.ownerDocument!=document?c.appendChild(a.cloneNode(!0)):c.appendChild(a);d.appendChild(c);b.appendChild(d)}else b.innerHTML=a;return b};mxSvgCanvas2D.prototype.updateText=function(a,b,c,d,e,f,g,k,l,m,n){null!=n&&null!=n.firstChild&&null!=n.firstChild.firstChild&&this.updateTextNodes(a,b,c,d,e,f,g,k,l,m,n.firstChild)};
-mxSvgCanvas2D.prototype.addForeignObject=function(a,b,c,d,e,f,g,k,l,m,n,p,q,r,t){q=this.createElement("foreignObject");var u=this.createElement("g");r.ownerDocument!=document&&(r=mxUtils.importNodeImplementation(q.ownerDocument,r,!0));q.appendChild(r);u.appendChild(q);this.updateTextNodes(a,b,c,d,f,g,k,m,n,p,u);this.root.ownerDocument!=document&&(a=this.createAlternateContent(q,a,b,c,d,e,f,g,k,l,m,n,p),null!=a&&(q.setAttribute("requiredFeatures","http://www.w3.org/TR/SVG11/feature#Extensibility"),
-b=this.createElement("switch"),b.appendChild(q),b.appendChild(a),u.appendChild(b)));t.appendChild(u)};
-mxSvgCanvas2D.prototype.updateTextNodes=function(a,b,c,d,e,f,g,k,l,m,n){a+=this.state.dx;b+=this.state.dy;var p=this.state.scale,q=n.firstChild,r=q.firstChild,t=r.firstChild,u=t.firstChild,x=this.getTextCss();q.setAttribute("width",Math.ceil(1/Math.min(1,p)*100)+"%");q.setAttribute("height",Math.ceil(1/Math.min(1,p)*100)+"%");q.setAttribute("style","overflow: visible;");q.setAttribute("pointer-events","none");mxSvgCanvas2D.createCss(c,d,e,f,g,k,l,null!=this.state.fontBackgroundColor?this.state.fontBackgroundColor:
-null,null!=this.state.fontBorderColor?this.state.fontBorderColor:null,"display: flex; align-items: unsafe "+(f==mxConstants.ALIGN_TOP?"flex-start":f==mxConstants.ALIGN_BOTTOM?"flex-end":"center")+"; justify-content: unsafe "+(e==mxConstants.ALIGN_LEFT?"flex-start":e==mxConstants.ALIGN_RIGHT?"flex-end":"center")+"; ",x,p,mxUtils.bind(this,function(c,d,e,f,g){r.setAttribute("style",e+"padding-left: "+Math.round(a+c)+"px; padding-top: "+Math.round(b+d)+"px;");t.setAttribute("style",f);u.setAttribute("style",
-g);c=(this.rotateHtml?this.state.rotation:0)+(null!=m?m:0);c=(0!=this.foOffset?"translate("+this.foOffset+" "+this.foOffset+") ":"")+(1!=p?"scale("+p+") ":"")+(0!=c?"rotate("+c+" "+a+" "+b+")":"");""!=c?n.setAttribute("transform",c):n.removeAttribute("transform");1!=this.state.alpha?n.setAttribute("opacity",this.state.alpha):n.removeAttribute("opacity")}))};
+mxSvgCanvas2D.prototype.addForeignObject=function(a,b,c,d,e,f,g,k,l,m,n,p,q,r,t){q=this.createElement("g");var u=this.createElement("foreignObject");u.setAttribute("style","overflow: visible; text-align: left;");u.setAttribute("pointer-events","none");r.ownerDocument!=document&&(r=mxUtils.importNodeImplementation(u.ownerDocument,r,!0));u.appendChild(r);q.appendChild(u);this.updateTextNodes(a,b,c,d,f,g,k,m,n,p,q);this.root.ownerDocument!=document&&(a=this.createAlternateContent(u,a,b,c,d,e,f,g,k,l,
+m,n,p),null!=a&&(u.setAttribute("requiredFeatures","http://www.w3.org/TR/SVG11/feature#Extensibility"),b=this.createElement("switch"),b.appendChild(u),b.appendChild(a),q.appendChild(b)));t.appendChild(q)};
+mxSvgCanvas2D.prototype.updateTextNodes=function(a,b,c,d,e,f,g,k,l,m,n){var p=this.state.scale;mxSvgCanvas2D.createCss(c,d,e,f,g,k,l,null!=this.state.fontBackgroundColor?this.state.fontBackgroundColor:null,null!=this.state.fontBorderColor?this.state.fontBorderColor:null,"display: flex; align-items: unsafe "+(f==mxConstants.ALIGN_TOP?"flex-start":f==mxConstants.ALIGN_BOTTOM?"flex-end":"center")+"; justify-content: unsafe "+(e==mxConstants.ALIGN_LEFT?"flex-start":e==mxConstants.ALIGN_RIGHT?"flex-end":
+"center")+"; ",this.getTextCss(),p,mxUtils.bind(this,function(c,d,e,f,g){a+=this.state.dx;b+=this.state.dy;var k=n.firstChild,l=k.firstChild,q=l.firstChild,r=(this.rotateHtml?this.state.rotation:0)+(null!=m?m:0),t=(0!=this.foOffset?"translate("+this.foOffset+" "+this.foOffset+")":"")+(1!=p?"scale("+p+")":"");q.firstChild.setAttribute("style",g);q.setAttribute("style",f);k.setAttribute("width",Math.ceil(1/Math.min(1,p)*100)+"%");k.setAttribute("height",Math.ceil(1/Math.min(1,p)*100)+"%");d=Math.round(b+
+d);0>d?k.setAttribute("y",d):(k.removeAttribute("y"),e+="padding-top: "+d+"px; ");l.setAttribute("style",e+"margin-left: "+Math.round(a+c)+"px;");t+=0!=r?"rotate("+r+" "+a+" "+b+")":"";""!=t?n.setAttribute("transform",t):n.removeAttribute("transform");1!=this.state.alpha?n.setAttribute("opacity",this.state.alpha):n.removeAttribute("opacity")}))};
 mxSvgCanvas2D.createCss=function(a,b,c,d,e,f,g,k,l,m,n,p,q){p="box-sizing: border-box; text-align: "+(c==mxConstants.ALIGN_LEFT?"left":c==mxConstants.ALIGN_RIGHT?"right":"center")+"; ";var r=mxUtils.getAlignmentAsPoint(c,d);c="overflow: hidden; ";d="width: 1px; ";var t="height: 1px; ",u=r.x*a,r=r.y*b;g?(d="width: "+Math.round(a)+"px; ",p+="max-height: "+Math.round(b)+"px; ",r=0):"fill"==f?(d="width: "+Math.round(a)+"px; ",t="height: "+Math.round(b)+"px; ",n+="width: 100%; height: 100%; ",p+=d+t):
 "width"==f?(d="width: "+Math.round(a)+"px; ",n+="width: 100%; ",p+=d,r=0,0<b&&(p+="max-height: "+Math.round(b)+"px; ")):(c="",r=0);b="";null!=k&&(b+="background-color: "+k+"; ");null!=l&&(b+="border: 1px solid "+l+"; ");""==c||g?n+=b:p+=b;e&&0<a?(n+="white-space: normal; word-wrap: "+mxConstants.WORD_WRAP+"; ",d="width: "+Math.round(a)+"px; ",""!=c&&"fill"!=f&&(r=0)):(n+="white-space: nowrap; ",""==c&&(u=0));q(u,r,m+d+t,p+c,n,c)};
 mxSvgCanvas2D.prototype.getTextCss=function(){var a=this.state,b="display: inline-block; font-size: "+a.fontSize+"px; font-family: "+a.fontFamily+"; color: "+a.fontColor+"; line-height: "+(mxConstants.ABSOLUTE_LINE_HEIGHT?a.fontSize*mxConstants.LINE_HEIGHT+"px":mxConstants.LINE_HEIGHT*this.lineHeightCorrection)+"; pointer-events: "+(this.pointerEvents?this.pointerEventsValue:"none")+"; ";(a.fontStyle&mxConstants.FONT_BOLD)==mxConstants.FONT_BOLD&&(b+="font-weight: bold; ");(a.fontStyle&mxConstants.FONT_ITALIC)==
@@ -2271,13 +2271,13 @@ Graph.prototype.defaultPageBorderColor="#ffffff";Graph.prototype.scrollTileSize=
 Graph.prototype.defaultThemes={};Graph.prototype.baseUrl=null!=urlParams.base?decodeURIComponent(urlParams.base):(window!=window.top?document.referrer:document.location.toString()).split("#")[0];Graph.prototype.editAfterInsert=!1;Graph.prototype.builtInProperties=["label","tooltip","placeholders","placeholder"];Graph.prototype.standalone=!1;
 Graph.prototype.init=function(a){mxGraph.prototype.init.apply(this,arguments);this.cellRenderer.initializeLabel=function(a,e){mxCellRenderer.prototype.initializeLabel.apply(this,arguments);var b=a.view.graph.tolerance,l=!0,m=null,p=mxUtils.bind(this,function(a){l=!0;m=new mxPoint(mxEvent.getClientX(a),mxEvent.getClientY(a))}),v=mxUtils.bind(this,function(a){l=l&&null!=m&&Math.abs(m.x-mxEvent.getClientX(a))<b&&Math.abs(m.y-mxEvent.getClientY(a))<b}),A=mxUtils.bind(this,function(b){if(l)for(var d=mxEvent.getSource(b);null!=
 d&&d!=e.node;){if("a"==d.nodeName.toLowerCase()){a.view.graph.labelLinkClicked(a,d,b);break}d=d.parentNode}});mxEvent.addGestureListeners(e.node,p,v,A);mxEvent.addListener(e.node,"click",function(a){mxEvent.consume(a)})};this.initLayoutManager()};
-(function(){Graph.prototype.useCssTransforms=!1;Graph.prototype.currentScale=1;Graph.prototype.currentTranslate=new mxPoint(0,0);Graph.prototype.isFastZoomEnabled=function(){return"nocss"!=urlParams.zoom&&!mxClient.NO_FO&&!mxClient.IS_EDGE&&!this.useCssTransforms&&this.isCssTransformsSupported()};Graph.prototype.isCssTransformsSupported=function(){return this.dialect==mxConstants.DIALECT_SVG&&!mxClient.NO_FO};Graph.prototype.getCellAt=function(a,b,e,p,v,A){this.useCssTransforms&&(a=a/this.currentScale-
-this.currentTranslate.x,b=b/this.currentScale-this.currentTranslate.y);return this.getScaledCellAt.apply(this,arguments)};Graph.prototype.getScaledCellAt=function(a,b,e,p,v,A){p=null!=p?p:!0;v=null!=v?v:!0;null==e&&(e=this.getCurrentRoot(),null==e&&(e=this.getModel().getRoot()));if(null!=e)for(var c=this.model.getChildCount(e)-1;0<=c;c--){var d=this.model.getChildAt(e,c),f=this.getScaledCellAt(a,b,d,p,v,A);if(null!=f)return f;if(this.isCellVisible(d)&&(v&&this.model.isEdge(d)||p&&this.model.isVertex(d))&&
-(f=this.view.getState(d),null!=f&&(null==A||!A(f,a,b))&&this.intersects(f,a,b)))return d}return null};mxCellHighlight.prototype.getStrokeWidth=function(a){a=this.strokeWidth;this.graph.useCssTransforms&&(a/=this.graph.currentScale);return a};mxGraphView.prototype.getGraphBounds=function(){var a=this.graphBounds;if(this.graph.useCssTransforms)var b=this.graph.currentTranslate,e=this.graph.currentScale,a=new mxRectangle((a.x+b.x)*e,(a.y+b.y)*e,a.width*e,a.height*e);return a};mxGraphView.prototype.viewStateChanged=
-function(){this.graph.useCssTransforms?this.validate():this.revalidate();this.graph.sizeDidChange()};var a=mxGraphView.prototype.validate;mxGraphView.prototype.validate=function(b){this.graph.useCssTransforms&&(this.graph.currentScale=this.scale,this.graph.currentTranslate.x=this.translate.x,this.graph.currentTranslate.y=this.translate.y,this.scale=1,this.translate.x=0,this.translate.y=0);a.apply(this,arguments);this.graph.useCssTransforms&&(this.graph.updateCssTransform(),this.scale=this.graph.currentScale,
-this.translate.x=this.graph.currentTranslate.x,this.translate.y=this.graph.currentTranslate.y)};Graph.prototype.updateCssTransform=function(){var a=this.view.getDrawPane();if(null!=a)if(a=a.parentNode,this.useCssTransforms){var b=a.getAttribute("transform");a.setAttribute("transformOrigin","0 0");var e=Math.round(100*this.currentScale)/100;a.setAttribute("transform","scale("+e+","+e+")translate("+Math.round(100*this.currentTranslate.x)/100+","+Math.round(100*this.currentTranslate.y)/100+")");if(b!=
-a.getAttribute("transform"))try{if(mxClient.IS_EDGE){var p=a.style.display;a.style.display="none";a.getBBox();a.style.display=p}}catch(v){}}else a.removeAttribute("transformOrigin"),a.removeAttribute("transform")};var b=mxGraphView.prototype.validateBackgroundPage;mxGraphView.prototype.validateBackgroundPage=function(){var a=this.graph.useCssTransforms,e=this.scale,m=this.translate;a&&(this.scale=this.graph.currentScale,this.translate=this.graph.currentTranslate);b.apply(this,arguments);a&&(this.scale=
-e,this.translate=m)};var e=mxGraph.prototype.updatePageBreaks;mxGraph.prototype.updatePageBreaks=function(a,b,m){var c=this.useCssTransforms,l=this.view.scale,A=this.view.translate;c&&(this.view.scale=1,this.view.translate=new mxPoint(0,0),this.useCssTransforms=!1);e.apply(this,arguments);c&&(this.view.scale=l,this.view.translate=A,this.useCssTransforms=!0)}})();Graph.prototype.isLightboxView=function(){return this.lightbox};Graph.prototype.isViewer=function(){return!1};
+(function(){Graph.prototype.useCssTransforms=!1;Graph.prototype.currentScale=1;Graph.prototype.currentTranslate=new mxPoint(0,0);Graph.prototype.isFastZoomEnabled=function(){return"nocss"!=urlParams.zoom&&!mxClient.NO_FO&&!mxClient.IS_EDGE&&!this.useCssTransforms&&this.isCssTransformsSupported()};Graph.prototype.isCssTransformsSupported=function(){return this.dialect==mxConstants.DIALECT_SVG&&!mxClient.NO_FO&&(!this.lightbox||!mxClient.IS_SF)};Graph.prototype.getCellAt=function(a,b,e,p,v,A){this.useCssTransforms&&
+(a=a/this.currentScale-this.currentTranslate.x,b=b/this.currentScale-this.currentTranslate.y);return this.getScaledCellAt.apply(this,arguments)};Graph.prototype.getScaledCellAt=function(a,b,e,p,v,A){p=null!=p?p:!0;v=null!=v?v:!0;null==e&&(e=this.getCurrentRoot(),null==e&&(e=this.getModel().getRoot()));if(null!=e)for(var c=this.model.getChildCount(e)-1;0<=c;c--){var d=this.model.getChildAt(e,c),f=this.getScaledCellAt(a,b,d,p,v,A);if(null!=f)return f;if(this.isCellVisible(d)&&(v&&this.model.isEdge(d)||
+p&&this.model.isVertex(d))&&(f=this.view.getState(d),null!=f&&(null==A||!A(f,a,b))&&this.intersects(f,a,b)))return d}return null};mxCellHighlight.prototype.getStrokeWidth=function(a){a=this.strokeWidth;this.graph.useCssTransforms&&(a/=this.graph.currentScale);return a};mxGraphView.prototype.getGraphBounds=function(){var a=this.graphBounds;if(this.graph.useCssTransforms)var b=this.graph.currentTranslate,e=this.graph.currentScale,a=new mxRectangle((a.x+b.x)*e,(a.y+b.y)*e,a.width*e,a.height*e);return a};
+mxGraphView.prototype.viewStateChanged=function(){this.graph.useCssTransforms?this.validate():this.revalidate();this.graph.sizeDidChange()};var a=mxGraphView.prototype.validate;mxGraphView.prototype.validate=function(b){this.graph.useCssTransforms&&(this.graph.currentScale=this.scale,this.graph.currentTranslate.x=this.translate.x,this.graph.currentTranslate.y=this.translate.y,this.scale=1,this.translate.x=0,this.translate.y=0);a.apply(this,arguments);this.graph.useCssTransforms&&(this.graph.updateCssTransform(),
+this.scale=this.graph.currentScale,this.translate.x=this.graph.currentTranslate.x,this.translate.y=this.graph.currentTranslate.y)};Graph.prototype.updateCssTransform=function(){var a=this.view.getDrawPane();if(null!=a)if(a=a.parentNode,this.useCssTransforms){var b=a.getAttribute("transform");a.setAttribute("transformOrigin","0 0");var e=Math.round(100*this.currentScale)/100;a.setAttribute("transform","scale("+e+","+e+")translate("+Math.round(100*this.currentTranslate.x)/100+","+Math.round(100*this.currentTranslate.y)/
+100+")");if(b!=a.getAttribute("transform"))try{if(mxClient.IS_EDGE){var p=a.style.display;a.style.display="none";a.getBBox();a.style.display=p}}catch(v){}}else a.removeAttribute("transformOrigin"),a.removeAttribute("transform")};var b=mxGraphView.prototype.validateBackgroundPage;mxGraphView.prototype.validateBackgroundPage=function(){var a=this.graph.useCssTransforms,e=this.scale,m=this.translate;a&&(this.scale=this.graph.currentScale,this.translate=this.graph.currentTranslate);b.apply(this,arguments);
+a&&(this.scale=e,this.translate=m)};var e=mxGraph.prototype.updatePageBreaks;mxGraph.prototype.updatePageBreaks=function(a,b,m){var c=this.useCssTransforms,l=this.view.scale,A=this.view.translate;c&&(this.view.scale=1,this.view.translate=new mxPoint(0,0),this.useCssTransforms=!1);e.apply(this,arguments);c&&(this.view.scale=l,this.view.translate=A,this.useCssTransforms=!0)}})();Graph.prototype.isLightboxView=function(){return this.lightbox};Graph.prototype.isViewer=function(){return!1};
 Graph.prototype.labelLinkClicked=function(a,b,e){b=b.getAttribute("href");if(null!=b&&!this.isCustomLink(b)&&mxEvent.isLeftMouseButton(e)&&!mxEvent.isPopupTrigger(e)||mxEvent.isTouchEvent(e)){if(!this.isEnabled()||this.isCellLocked(a.cell))a=this.isBlankLink(b)?this.linkTarget:"_top",this.openLink(this.getAbsoluteUrl(b),a);mxEvent.consume(e)}};
 Graph.prototype.openLink=function(a,b,e){var c=window;try{if("_self"==b&&window!=window.top)window.location.href=a;else if(a.substring(0,this.baseUrl.length)==this.baseUrl&&"#"==a.charAt(this.baseUrl.length)&&"_top"==b&&window==window.top){var l=a.split("#")[1];window.location.hash=="#"+l&&(window.location.hash="");window.location.hash=l}else c=window.open(a,b),null==c||e||(c.opener=null)}catch(m){}return c};Graph.prototype.getLinkTitle=function(a){return a.substring(a.lastIndexOf("/")+1)};
 Graph.prototype.isCustomLink=function(a){return"data:"==a.substring(0,5)};Graph.prototype.customLinkClicked=function(a){return!1};Graph.prototype.isExternalProtocol=function(a){return"mailto:"===a.substring(0,7)};Graph.prototype.isBlankLink=function(a){return!this.isExternalProtocol(a)&&("blank"===this.linkPolicy||"self"!==this.linkPolicy&&!this.isRelativeUrl(a)&&a.substring(0,this.domainUrl.length)!==this.domainUrl)};